###变量 使用关键字var定义变量,自动初始化为零值。若提供变量值,由编译器自动推断
package main
import(
"fmt"
)
func test()(int,string){
return 1,"abc"
}
func main(){
//s声明变量并进行初始化
var m int=10
fmt.Println("%d\n",m)
//声明时不指明类型,通过初始化值来推导
var t=true
if t==true{
fmt.Printf("bool值为真.\n")
}
//多变量赋值时,先计算所有相关值,然后再从左到右依次赋值
data,i:=[3]int{0,1,1},0
i,data[i]=2,100
fmt.Println(data)
//可一次定义多个变量
var x,y,z int
var d,n="ab",123
//注意小括号的使用
var(
a int
b float32
)
fmt.Println(x,d,n,y,z,a,b)
//_ go中的特殊变量,任何赋给它的值将被丢弃
_,s:=test()
println(s)
}
编译器会将未使用的局部变量当做错误,使用全局变量就不会报错
注意重新赋值与定义新同名变量的区别
var s string="abc"
fmt.Println(&s)
s,y:="hello","uu" //重新赋值:与第一个s 在同一层次的代码块中,且有新的变量呗定义
fmt.Println(&s,y)
{
s,z:=10000,30 //定义新同名变量:不在同一层次代码块
fmt.Println(&s,z)
}
###常量 常量值必须是编译器可确定的数字、字符串、布尔值
func main(){
const x,y int=1,2 //多常量初始化
const s="hello world" //类型推断
const(
a,b=10,100
c bool=false //未使用的局部变量不会报错
)
}
在常量组中,如不提供类型和初始化值,那么视作与上一常量相同
const(
s ="aaa"
x //x="aaa"
)
常量值还可以是len cap unsafe sizeof 等编译器可确定的函数返回值
const(
a= "abc"
b= len(a)
c=unsafe.sizeof(b)
)
如果常量类型足以存储初始化值,那么不会引发溢出错误
const(
a byte=100 //int to byte
b int=le20 //float64 to int,overflow
)
###枚举 关键字iota 定义常量组中从0开始换行计数的自增枚举值
const(
sunday =iota //0
monday //1
tuesday //2
wednesday //3
)
const(
_ = iota //iota=0
KB = 1<<(10*iota) // iota=1 1<<用法含义和C语言一样
MB = 1<<(10*iota) // iota=2
)
如果iota被打断,需显示恢复
const(
A = iota //0
B //1
C = 'C' //C
D //C
E =iota //4
)
可通过自定义类型来实现枚举类型限制
type Color int
const(
Black Color = iota
Red
Blue
)
func test (c Color){
fmt.Println(c)
}
func main(){
c :=Black
test(c)
x :=1
test(x) //Error: x declared and not used
}
本文学习来自https://github.com/qyuhen/book