emm,发觉自己没有系统的学习。都是有需求来临时调研技术,从今天起每天抽出时间系统化学习Go.
类型
Go是静态类型语言,运行期间不能改变类型
定义
- 可以使用var 关键字
- 可以使用 := 让系统推导类型
example:
1var a int 2a := 0 3是一致的
但是要注意一点
1var a int 2f := func () { 3 a:=1 //此时是局部变量(没进行参数传递) 4} 5f() 6此时a的值不会变
更灵活的语法:
1var x , y ,z int 2x,y,z := 1,float64(12313),"dassad" //动态类型推导,不建议这么写,增加阅读难度
特殊占位符 _
_用于将结果忽略的位置
1func test() (int, string) { 2 return 1, "abc" 3} 4func main() { 5 _, s := test() 6 println(s) 7}
代码块定义
代码块内有新的变量生命周期
1s := "abc" 2println(&s) 3 4s, y := "hello", 20 // 重新赋值: 与前 s 在同⼀层次的代码块中,且有新的变量被定义。 5println(&s, y) // 通常函数多返回值 err 会被重复使⽤。 6 7{ 8 s, z := 1000, 30 // 定义新同名变量: 不在同⼀层次代码块。 9 println(&s, z) 10}
基本类型
类型
长度
默认值
说明
bool
1
false
byte
1
0
uint8 之间可以相互转换
rune
4
0
unicode code point,int32
int/uint
4或者8
0
32位长度4 64位长度8
int8/uint8
1
0
-128127, 0255
int16/uint16
2
0
-3276832767,065535
int32/uint32
4或者8
0
32位长度4 64位长度8, 21亿正负
int64/uint64
8
0
complex64
8
0
复数类型
complex128
16
0
复数类型
array
值类型
struct
值类型
string
""
值类型
slice
4或者8
nil
引用类型
map
4或者8
nil
引用类型
channel
4或者8
nil
引用类型
interface
nil
接口类型
function
nil
函数类型
new 和 make对引用类型的区别
引⽤类型包括 slice、map 和 channel。它们有复杂的内部结构,除了申请内存外,还需 要初始化相关属性。
new会计算引用类型大小,并为其分配初始值(默认值),并返回指针
make会被编译期编译为具体创建函数,分配内存和初始化成员结构,返回对象而非指针
1a:=[]int{0,0,0} 2a[1] = 10 3b := make([]int, 3) 4b[1] = 10 5 6c:=new([]int) //指针,但是只有头指针,可以append,但是不能直接使用 7c[1]=10
常量
golang的常量只支持编译器可确定的类型。(数字、字符串、布尔)
不能定义在方法体内部
常量值还可以是 len、cap、unsafe.Sizeof 等编译期可确定结果的函数返回值。
重点: 编译期可确定的值(因为常量是不可写的,要在编译期确定结果,放入常量内存区域)
枚举
关键字 iota 定义常量组中从 0 开始按⾏计数的⾃增枚举值。
每一个const内iota都会从0开始
1const ( 2 Sunday = iota // 0 3 Monday // 1,通常省略后续⾏表达式。 4 Tuesday // 2 5 Wednesday // 3 6 Thursday // 4 7 Friday // 5 8 Saturday // 6 9) 10 11const ( 12 Sunday1 = iota // 0 13 Monday1 // 1,通常省略后续⾏表达式。 14 Tuesday1 // 2 15 Wednesday1 // 3 16 Thursday1 // 4 17 Friday1 // 5 18 Saturday1 // 6 19)