本章主要介绍了四种类型:数组、slice、map和结构体。
数组
跟 js 不一样,go 的数组是固定的,不过可以通过 Slice(切片)来截取或增加数组内容。
数组的索引从 0 开始,到长度-1结束,数组长度通过 len 获取。
1 | var a [3]int // 数组声明 |
数组未带初始化时,为该类型默认的零值。
1 | a := [...]int{1, 2, 3} // 简化声明 |
省略号 ...
是根据初始值个数来计算的的,可以方便我们修改数据。
Slice(切片)
Slice(切片)代表变长的序列,slice 的语法和数组很像,只是没有固定长度而已。
一个 slice 由三个部分构成:指针、长度和容量,内置的 len
和 cap
函数分别返回 slice 的长度和容量。
1 | arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} |
或者直接创建 Slice 类型:
1 | arr := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} |
注意,[]
里没写数组大小以及 ...
,这是声明一个 Slice 类型。
slice 之间不能最 ==
比较,唯一合法的比较操作是和nil比较。
1 | arr := []int{1, 2, 3} |
通过 append
添加 Slice 元素。
Map
它是一个无序的key/value对的集合,就类似 js 的对象字面量一样,只是带了类型。
1 | a := make(map[string]int) |
通过 make
创建,或直接字面量创建 map,通过 delete
删除指定键。
1 | a := map[string]map[string]int{ |
嵌套的 map 也还好,就是声明部分比较长,键值的表示跟 js 的几乎一样。
结构体
这个概念是我大学的时候学 C 接触到的概念,之后就再也没接触了。。
不过 go 的结构体还是比较简单直观的。
1 | type Point struct { |
使用:
1 | a := Point{11, 22} // 按值的顺序 |
嵌入:
1 | type Point struct { |
使用的时候要注意,不能直接填值,要跟类型一起填充。
1 | a := Wheel{Circle{Point{11, 22}, 33}, 44} |
JSON
算是扩展说明了,因为只是 结构体 和 encoding/json
包的应用。
结构体声明如下:
1 | type Movie struct { |
应用如下:
1 | var movies = []Movie{ |
json 数据里 Year 变成了 released,Color 变成了 color,而且 Color 为 false 时,json 数据里忽略了这个字段。
这是因为构体成员 Tag 所导致的,也就是 json:"released"
和 json:"color,omitempty"
控制的。
文本和HTML模板
乍一看跟 es6 的字符模板一毛一样。。
其实还是有一点点小区别的。
1 | const templ = `{{.TotalCount}} issues: |
模板中标签中数据输出是以 .
开头的字段,如果不是,那就是命令,例如 range
开始 end
结束的,就是个循环。
而 html 模板跟 text 模板唯一区别就是实体转义。
小结
复合数据类型,其实出了语法外,都是基本类型的各种组合。
明天就是函数部分了,加油。