标识符包括常量、变量、类型、函数名、结构字段等 若标识符以大写字母开头,则它的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包)——导出;标识符如果以小写字母开头,则对包外是不可见的。
在习惯上,Go语言程序员推荐使用 驼峰式 命名,当名字有几个单词组成的时优先使用大小写分隔,而 不是优先用下划线分隔。
声明多个变量 var 变量名字 类型 = 表达式 1.省略类型
2.省略“= 表达式”
默认零值: 数值类型变量对应的零值是0,布尔类型变量对应的零值是false,字符串类型对应的零值是空字符串,接口或引用 类型(包括slice、map、chan和函数)变量对应的零值是nil。数组或结构体等聚合类型对应的零值是每 个元素或字段都是对应该类型的零值。
3.省略var 以“名字 := 表达 式”形式声明变量,变量的类型根据表达式来自动推导。 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。
声明多个变量
同类型: var name1, name2 type = initialvalue1, initialvalue2。 不同类型: var ( name1 = initialvalue1, name2 = initialvalue2 )
空白标识符 _ 被用于抛弃值
1.bool型 bool 类型表示一个布尔值,值为 true 或者 false。
2.数字类型:int float32 float64 支持整型和浮点型 也支持复数,其中位运算采用补码。
3.字符串string 内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目),索引操作s[i]返回第i个字节 的字节值,i必须满足0 ≤ i< len(s)条件约束。
4.派生类型: 指针、数组、struct、Channel、函数、切片、接口类型、Map
5.其余类型: uint8 uint16 uint32 uint64 int8 int16 int32 int64 float32 float64 complex64:32位实数与虚数 complex128:64位实数与虚数 byte:类似unit8 rune:类似int32 uintptr:无符号整型 用于存放一个指针
类型转换 把 v 转换为 T 类型的语法是 T(v)。
const identifier [type] = value 可以省略type
iota 常量生成器 iota 在 const关键字出现时将被重置为 0,const 中每新增一行常量声明将使 iota 计数一次。
一个数组的表示形式为 [n]T。n 表示数组中元素的数量,T 代表每个元素的类型。数组的大小是类型的一部分。 可以忽略声明数组的长度n,并用 … 代替,让编译器自动计算长度。 a := [3]int{12, 78, 50} a := […]int{12, 78, 50}
Go 中的数组是值类型而不是引用类型。这意味着当数组赋值给一个新的变量时,该变量会得到一个原始数组的一个副本。如果对新变量进行更改,则不会影响原始数组。同样,当数组作为参数传递给函数时,它们是按值传递,而原始数组保持不变。
使用 range 迭代数组 通过使用 for 循环的 range 方法来遍历数组。range 返回索引和该索引处的值。
多维数组 var a = [5][2]int{ {0,0}, {1,2}, {2,4}, {3,6},{4,8}}
带有 T 类型元素的切片由 []type表示
也可以使用make函数来创建切片: var s1 []type = make([]type, len) 或s1 := make([]type, len)
s := arr[startIndex:endIndex] s := arr[startIndex:] s := arr[:endIndex]
一个slice由三个部分构成:指针、长度 和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一 定就是数组的第一个元素。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。内置的len和cap函数分别返回slice的长度和容量。
对切片所做的任何修改都会反映在底层数组中。
追加切片元素 append 函数的定义是 func append(切片名[]T,参数 … T)[]T。
使用 copy 函数 func copy(dst,src[]T)int 来生成一个切片的副本。 copy(numbers1,numbers) 是拷贝numbers的内容到numbers1
指针变量的类型为 *T,该指针指向一个 T 类型的变量。 *来获取指针所指向的内容,&取变量内存地址
指针的解引用 指针的解引用可以获取指针所指向的变量的值, *a。
指针数组:var ptr [MAX]*int; 向函数传递一个数组指针参数,并在函数内修改数组,最好使用切片来处理。
Map 是一种无序的键值对的集合。 创建 使用 make 函数:make(map[type of key]type of value) 添加元素
ages := map[string]int{ "alice": 31, "charlie": 34, }或者
ages := make(map[string]int) ages["alice"] = 31 ages["charlie"] = 34删除元素 使用内置的delete函数可以删除元素: delete(map名, key)
获取元素 获取 map 元素的语法是 map名[key] 。
判断 map 中是否存在这个 key:value, ok := map[key] if ok == true,表示 key 存在,key 对应的值就是 value ,false表示 key 不存在。
遍历 map 中所有的元素需要用 for range 循环。不保证每次执行程序获取的元素顺序相同。
改变元素 和 slices 类似,map 也是引用类型。当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。
命名的结构体 创建了名为 Employee 的新类型
type Employee struct { firstName string lastName string age int }匿名结构体 没有定义任何结构体类型
var employee struct { firstName, lastName string age int }或者
e:= struct { firstName, lastName string age, salary int }访问结构体 点号操作符 . 用于访问结构体的字段
可以创建指向结构体的指针,例如 e := &Employee{" , , ,“} fmt.Println((*emp8).firstName) 这里(*e).firstName表示访问结构体 e 的 firstName 字段
匿名字段 只有类型,而没有字段名的字段,匿名字段的名称就默认为它的类型
type Person struct { string int }嵌套结构体
提升字段 结构体中匿名的结构体类型字段