揭阳网站制作计划,海淀做企业网站的公司,优化企业网站排名要多少钱,网站关键词排名怎么做目录 定义枚举iota思考题 定义
go语言常量的定义和其他语言类似#xff0c;常量中的数据类型只能是布尔型#xff0c;数字型#xff08;整型、浮点型、复数#xff09;和字符串型 常量的定义方式和变量一样#xff0c;只不过变量定义使用 var 关键字#xff0c;而常量定… 目录 定义枚举iota思考题 定义
go语言常量的定义和其他语言类似常量中的数据类型只能是布尔型数字型整型、浮点型、复数和字符串型 常量的定义方式和变量一样只不过变量定义使用 var 关键字而常量定义是使用 const 关键字
//常量的定义方式
const a string hello同样类型也可以省略编译器会根据值来判断类型
const a hello多个相同类型的常量声明
const a, b 1, 2枚举
在C中由专门的枚举类型关键字enum在go语言中则用常量表示枚举
const (fruit 0vegetable 1
)数字 0 代表水果数字 1 代表蔬菜
//demo1
package mainimport (fmtunsafe
)const (a hellob len(a) //长度c unsafe.Sizeof(a) //字节数
)func main() {fmt.Println(a, b, c)
}结果是
hello 5 16为什么 unsafe.Sizeof() 是 16 呢 实际上只要是字符串类型它都是 16。 因为字符串类型对应一个结构体该结构体有两个域一个是指向字符串的指针一个是字符串的长度每个域都占 8 个字节但是不包含指针指向的字符串的内容也就是说字符串里你放 3 个字符和 5 个字符最终都占 16 个字节。 把上面说的结构体可以看成
typedef struct {char* buffer; //指向该字符串的指针占 8 个字节size_tlen; //字符串的长度占 8 个字节
} String;第二个域字符串的长度占 8 个字节哪怕这个字符串的长度是 0它也占 8 个字节。可以想象一下假设一个教室里面有 n 个座位这 n 个座位不管坐多少个人哪怕没有一个人这些座位仍然把教室的空间占着。除非把教室拆了同理创建字符串的时候空间已经占用了无论里面有没有东西。
iota
iota 是一个特殊常量。可以认为是一个能被编译器修改的常量 iota 在 const 关键字出现时将被重置为 0const 中每新增一行常量声明将使 iota 增加 1。
const (a iotab iotac iota
)第一个 iota 为 0当 iota 在新的一行被使用时它的值会自动加 1所以可以简写
const (a iotabc
)//demo2
package mainimport fmtfunc main() {const (a iota //开始计数从 0 开始b //1c //2d hello //3helloe //4相当于 e hellof //5相当于 f hellog 1 //61h //7相当于 h 1i //8相当于 i 1j iota // 恢复计数9k //10l //11)fmt.Println(a, b, c, d, e, f, g, h, i, j, k, l)
}输出结果是
0 1 2 hello hello hello 1 1 1 9 10 11那么 iota 在 const 关键字出现时将被重置为 0 怎么理解呢先看这段代码
//demo3
package mainfunc main() {const (a iotabcdef)println(a, b, c, d, e, f)
}输出结果是
0 1 2 3 4 5再看这段代码
//demo4
package mainfunc main() {const (a iotabc)println(a, b, c)const (d iotaef)println(d, e, f)
}输出结果是
0 1 2
0 1 2稍微琢磨一下上述两段代码就会很容易理解 iota 在 const 关键字出现时将被重置为 0 的含义了。
思考题
//demo5
package mainimport fmtfunc main() {const (a 1 iota //第一行b 3 iota //第二行c //第三行d //第四行)fmt.Println(a, b, c, d)
}这段代码的结果是多少 首先 表示左移。
先来看第一行iota 为 0因为这个 iota 是在 const 关键字刚出现那么第一行就可以表示成
a 1 0左移 0 位那就是没有变化。
再来看第二行此时 iota 为 1那么第二行就可以表示成
b 3 13 的二进制是 0000 0011为了看着方便我用八位二进制表示左移 1 位就变成了 0000 0110它的值是 2 ^ 2 2 ^ 1 6
再看第三行有了前面的 iota 的知识我们知道第三行本质上就是
c 3 iota此时 iota 已经变成 2 了。那么实际上第三行是
c 3 2 3 的二进制是 0000 0011左移两位变成了 0000 1100它的值是 2 ^ 3 2 ^ 2 12
再看第四行和第三行的区别在于 iota 变成了 3所以实际上第四行是
d 3 3将 0000 0011 左移 3 位变成了 0001 1000它的值是 2 ^ 4 2 ^ 3 24。
所以整段代码最终的输出结果是
1 6 12 24对于左移操作有简便算法左移一位表示乘以 2左移 n 位表示该数乘以 2 ^ n2的n次方所以左移一位其实是乘以 2 的一次方左移零位也是一样。可以用这种方法再算一遍看和上述结果是否一致。而右移和左移的唯一区别就是左移是乘以右移是除以。