常量

相对于变量而言,常量是在程序使用过程中,不会改变的数据。有些地方你需要将定义好的常量重复使用,代码中你不允许它的值改变。例如 圆周率 在程序执行过程中不会改变。

常量的声明

const Pi float64 = 3.14

const 声明、Pi 常量、float64 类型、3.14

多变量声明

const (
Pi float64 = 3.14 // 定义常量 Pi 类型为 float64 值为 3.14
Pi2 // 未定义类型和值默认取上一条类型和值
Age = 18 // 重新定义类型和值时为 int 值为 18
)

如果未声明常量的类型和值,它将从上一个常量中获取它,在上面 pi2 将会从 pi 上获取类型和值,如果新声明了常量,并且有分配值,它就是新声明的常量。 例如上面的 Age 就是 int 类型的 18。 如果再继续声明 Age2 不给 Age2 赋初始值的话, 默认就会取上一个 Age 的值和类型。

常量的作用域

常量只能在其声明的范围内使用,如果在一个函数内部作用域中声明的常量与外部名称相同,则只能用自己内部的常量,它将忽略外部的常量。例如:

package main

import "fmt"

// 定义了一个全局常量
const Pi float64 = 3.14 func main() {
// 在 main 函数中定义了一个局部常量
const Pi float64 = 3.1415 // 优先使用局部常量
fmt.Println(Pi) myfunc()
} func myfunc() {
// 这里是用全局常量
fmt.Println(Pi)
}

总结一下

  • 常量数值不能修改。
  • 常量定义后可以不使用。
  • 常量定义不能使用简短定义方式。
  • 常量种使用的数据类型只能是 整型、布尔、浮点、复数、字符串类型。

iota 特殊的常量

iota 是常量里面的计数器,初始值默认值是0,可以被编译器自动修改,每定义一组常量时,iota 逐行自增1。

package main

import "fmt"

func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}

iota如何使用

Go语言中没有提供像其他语言中的 enum 枚举类型,但是可以使用 const 来模拟枚举类型。iota 可以被用作枚举值。

package main

import (
"fmt"
) type Mytype int //定义一个常量 来模拟枚举类型 Spring设置为iota为值默认就是 0
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays
) func main() {
//打印定义的常量枚举信息Tuesday 值2
fmt.Printf("%v\n", Tuesday) //2
}

有趣的的 iota 实例

package main

import "fmt"
const (
i=1<<iota
j=3<<iota
k
l
) func main() {
fmt.Println("i=",i)
fmt.Println("j=",j)
fmt.Println("k=",k)
fmt.Println("l=",l)
}

以上实例运行结果为:

i= 1
j= 6
k= 12
l= 24

iota 表示从 0 开始自动加 1,所以 i=1<<0, j=3<<1(<< 表示左移的意思),即:i=1, j=6,这没问题,关键在 k 和 l,从输出结果看 k=3<<2l=3<<3

简单表述:

  • i=1:左移 0 位,不变仍为 1;
  • j=3:左移 1 位,变为二进制 110, 即 6;
  • k=3:左移 2 位,变为二进制 1100, 即 12;
  • l=3:左移 3 位,变为二进制 11000,即 24。

注:<<n==*(2^n)

左移运算符 << 是双目运算符。左移 n 位就是乘以 2 的 n 次方。 其功能把 << 左边的运算数的各二进位全部左移若干位,由 << 右边的数指定移动的位数,高位丢弃,低位补 0。

右移运算符 >> 是双目运算符。右移 n 位就是除以 2 的 n 次方。 其功能是把 >> 左边的运算数的各二进位全部右移若干位, >> 右边的数指定移动的位数。

Golang 入门 : 常量的更多相关文章

  1. Java程序员的Golang入门指南(下)

    Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...

  2. Java程序员的Golang入门指南(上)

    Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如 ...

  3. Golang入门(2):一天学完GO的基本语法

    摘要 在配置好环境之后,要研究的就是这个语言的语法了.在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆.因为这篇文章只是入门Golang的第二 ...

  4. Golang 入门 : 竞争条件

    笔者在前文<Golang 入门 : 理解并发与并行>和<Golang 入门 : goroutine(协程)>中介绍了 Golang 对并发的原生支持以及 goroutine 的 ...

  5. Golang 入门 : goroutine(协程)

    在操作系统中,执行体是个抽象的概念.与之对应的实体有进程.线程以及协程(coroutine).协程也叫轻量级的线程,与传统的进程和线程相比,协程的最大特点是 "轻"!可以轻松创建上 ...

  6. Golang 入门 : channel(通道)

    笔者在<Golang 入门 : 竞争条件>一文中介绍了 Golang 并发编程中需要面对的竞争条件.本文我们就介绍如何使用 Golang 提供的 channel(通道) 消除竞争条件. C ...

  7. 推荐一个GOLANG入门很好的网址

    推荐一个GOLANG入门很好的网址,栗子很全 https://books.studygolang.com/gobyexample/

  8. Golang的常量定义及使用案例

    Golang的常量定义及使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量的定义 package main import ( "fmt" ) fu ...

  9. Golang入门(4):并发

    摘要 并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要.Web服务器会一次处理成千上万的请求,这也是并发的必要性之一.Golang的并发控制比起Java来说,简单了不少.在Go ...

  10. Golang入门(3):一天学完GO的进阶语法

    摘要 在上一篇文章中,我们聊了聊Golang中的一些基础的语法,如变量的定义.条件语句.循环语句等等.他们和其他语言很相似,我们只需要看一看它们之间的区别,就差不多可以掌握了,所以作者称它们为&quo ...

随机推荐

  1. 🤺Universal and Transferable Adversarial Attacks on😊Aligned Language Models

  2. LetsTalk_Android中引导用户加入白名单图

    --------------------------------

  3. 长连接网关技术专题(八):B站基于微服务的API网关从0到1的演进之路

    本文由B站微服务技术团队资深开发工程师周佳辉原创分享. 1.引言 如果你在 2015 年就使用 B 站,那么你一定不会忘记那一年 B 站工作日选择性崩溃,周末必然性崩溃的一段时间. 也是那一年 B 站 ...

  4. Canal同步MySQL增量数据

    引言 在现在的系统开发中,为了提高查询效率 , 以及搜索的精准度, 会大量的使用 redis .memcache 等 nosql 系统的数据库 , 以及 solr . elasticsearch 类似 ...

  5. 编译Ubuntu 24.04 LTS 内核(BuildYourOwnKernel)

    1.配置环境 修改apt源 修改 /etc/apt/sources.list.d/ubuntu.sources ,添加 "deb-src"到 Types:,修改后的文件内容如下: ...

  6. Selenium Python 问题汇总

    1. 在自动化打开浏览器后会长时间加载,此时使用如下命令解决: driver.set_page_load_timeout(20) # 设置浏览器超时加载时间 driver.set_script_tim ...

  7. 利用Linq Skip() Take()分页

    private void TestPostData() { string all = ""; List<int> listTimeCard = new List< ...

  8. dubbo源码解析目录-总结列表

    一.dubbo架构设计 1.十层架构第一层:service层,接口层,给服务提供者和消费者来实现的.第二层:config层,配置层,主要是对dubbo进行各种配置的.第三层:proxy层,服务代理层, ...

  9. 第四章 对称加密算法--DES--AES--IDEA--PBE

    10.1.DES 已破解,不再安全,基本没有企业在用了 是对称加密算法的基石,具有学习价值 密钥长度56(JDK).56/64(BC) 10.2.DESede(三重DES) 早于AES出现来替代DES ...

  10. Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)

    题目链接:Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2) 总结:Bwa两发,C读假题.发挥很一般,补题感觉到E都是能做的,红温. A. ...