4.复合数据类型
- 数组
- Slice
- Map
- 结构体
- JSON
- 文本和HTML模板
数组
var a [3]int //数组的长度是固定的,声明之后没有赋值的会自动复制默认值。
q := [...]int{1, 2, 3}
书中有一个例子,我觉得特别好。
给数组玩出了MAP的感觉。
type Currency int
const (
USD Currency = iota // 美元
EUR // 欧元
GBP // 英镑
RMB // 人民币
)
symbol := [...]string{USD: "$", EUR: "€", GBP: "£", RMB: "¥"}
fmt.Println(RMB, symbol[RMB]) // "3 ¥"
注意:由于函数参数的传递机制,导致在传大数组的时候特别低效,这时候可以传指向数组的指针。
如果数组的类型是可以比较的,那么数组也能用==
来比较
Slice
类似一种没有长度的数组,然而他不能用==来相互比较。但是可以跟nil比。
append函数,往slice里添加元素 slice=(append(slice,value))
此处的=
是必不可少的。
每一次容量的变化都会导致重新分配内存和copy操作。当len
等于cap
时,再添加数据cap
会翻倍。
MAP:
1. ages := make(map[string]int) //使用内建的make函数
2. ages := map[string]int{
"alice": 31,
"charlie": 34,
}
3.delete(ages, "alice")//删除元素
结构体:多种数据类型的集合
type Employee struct {
ID int
Name string
Address string
DoB time.Time
Position string
Salary int
ManagerID int
}
结构体还能包含其他结构体,并且在名字没有冲突的情况下可以简单是使用.
+id
引用。传递较大的结构体的时候,可以使用指针来传输。
p :=&Point{}
JSON:
//定义结构体
type Movie struct {
Title string
Year int `json:"released"`
Color bool `json:"color,omitempty"`
Actors []string
}
//数据
var movies = []Movie{
{Title: "Casablanca", Year: 1942, Color: false,
Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
{Title: "Cool Hand Luke", Year: 1967, Color: true,
Actors: []string{"Paul Newman"}},
{Title: "Bullitt", Year: 1968, Color: true,
Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
// ...
}
//输出,但是没有格式化,输出的结果不好读
data, err := json.Marshal(movies)
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", data)
//格式化输出结果,每一行隔了一个空格,每一层隔4个空格
data, err := json.MarshalIndent(movies, "", " ")
if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", data)
文本和HTML模板
有点像java 的jsp,在静态的文本或html中添加动态的数据。