go基础 | 青训营笔记

53 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

4、常量

常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

 const identifier [type] = value   // 也可以多个相同类型的声明

常量还可以用作枚举:

 const (
     Unknown = 0
     Female = 1
     Male = 2
 )
 数字 0、1 和 2 分别代表未知性别、女性和男性。

常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过:

 package main
 ​
 import "unsafe"
 const (
     a = "abc"
     b = len(a)
     c = unsafe.Sizeof(a) // 字符串都是16 8位是字符串的指针8位是字符串的长度
 )
 ​
 func main(){
     println(a, b, c) // abc 3 16
 }

iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

iota 可以被用作枚举值:

 const (
     a = iota
     b = iota
     c = iota
 )
 第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:
 const (
     a = iota
     b
     c
 )
 ​
 ​
 iota 用法
 实例
 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)  // 0 1 2 ha ha 100 100 7 8
 }

实例(很奇怪):

 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<<2,l=3<<3。
 ​
 简单表述:
 ​
 i=1:左移 0 位,不变仍为 1。
 j=3:左移 1 位,变为二进制 110,即 6。
 k=3:左移 2 位,变为二进制 1100,即 12。(也就是说把j = 3的值也拿下来了)
 l=3:左移 3 位,变为二进制 11000,即 24

5、运算符

 需要注意的是只有后置++ 和 -- 并且需要单独一行 
 算术运算符 关系运算符 逻辑运算符(&& || !) 位运算符 赋值运算符 都是正常的 
 其他运算符 :
     &   返回变量存储地址    &a; 将给出变量的实际地址。(类似C语言取地址)
     *   指针变量。   *a; 是一个指针变量(和C语言指针变量一样)