1.变量
基本使用
声明变量的一般形式是使用 var 关键字:
package main import "fmt" func main() { var a string = "IMUSTCTF" fmt.Println(a) // IMUSTCTF var b, c int = 1, 2 fmt.Println(b, c) // 1 2
值类型和引用类型
所有像 int
、float
、bool
和 string
这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:
当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝:
你可以通过 &i 来获取变量 i 的内存地址,例如:0xf840000040(每次的地址都可能不一样)
值类型变量的值存储在堆中🌭
使用 := 赋值操作符
我们知道可以在变量的初始化时省略变量的类型而由系统自动推断,声明语句写上 var 关键字其实是显得有些多余了,因此我们可以将它们简写为 a := 50 或 b := false。
a 和 b 的类型(int 和 bool)将由编译器自动推断。
package main import "fmt" func main() { a := 521 fmt.Println(a) // 521 }
如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误,例如下面这个例子当中的变量 a:
package main import "fmt" func main() { var a string = "abc" fmt.Println("hello, world") }
尝试编译这段代码将得到错误 a declared but not used
2.常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。
显式类型定义: const b string = "abc"
隐式类型定义: const b = "abc"
package main import "fmt" func main() { const PI = 3.1415926 fmt.Println(PI) // 3.1415926 }
常量还可以用作枚举:
package main import "fmt" func main() { const ( Unknown = 0 Female = 1 Male = 2 ) fmt.Println(Unknown, Female, Male) // 0 1 2 }
在定义常量组时,如果不提供初始值,则表示将使用上行的表达式
package main import "fmt" const ( a = 1 b c d ) func main() { fmt.Println(a) // b、c、d没有初始化,使用上一行(即a)的值 fmt.Println(b) // 1 fmt.Println(c) // 1 fmt.Println(d) // 1 }
iota
iota,特殊常量,可以认为是一个可以被编译器修改的常量。常量计数器
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
iota 可以被用作枚举值:
package main import "fmt" func main() { const ( a = iota b c ) fmt.Println(a, b, c) // 0 1 2 }
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 }