map类型
map就是一个哈希表,通常就用来做数据容器,key和value可以是其他类型,不一定非要是字符串
var ss = map[string]int{
"z": 1,
"b": 2,
}
map也是引用类型
func main() {
var m0 = map[string]int{
"z": 1,
}
m1 := m0
m1["z"] = 2
fmt.Println(m0)
fmt.Println(m1)
}
有个小坑的地方,就是遍历map的时候,顺序是随记的(伪随机)
func main() {
var m = map[string]string{
"1": "一",
"2": "二",
"3": "三",
"4": "四",
"5": "五",
}
for key, val := range m {
fmt.Println(key, val)
}
}
struct
结构体 比较接近js里的class
func main() {
zs := Human{
Age: 19,
Name: "zhangsan",
}
}
type Human struct {
Age int
Name string
}
struct不是引用类型
func main() {
zs := Human{
Age: 19,
Name: "zhangsan",
}
lisi := zs
lisi.Name = "lisi"
fmt.Println(zs)
}
type Human struct {
Age int
Name string
}
上面可以挂载一堆方法
func (h Human) SayHi() {}
h叫做方法SayHi的接收器,Human是接收器的类型
接收器还可以是指针类型
func (h *Human) SayHi() {}
指针类型会造成数据的更改
func main() {
zs := Human{
Name: "张三",
}
zs.ChangeNameAndSayHi1("李四")
fmt.Println("使用非指针类型的接收器", zs.Name)
zs.ChangeNameAndSayHi2("李四")
fmt.Println("使用指针类型的接收器", zs.Name)
}
type Human struct {
Age int
Name string
}
func (h Human) ChangeNameAndSayHi1(name string) {
h.Name = name
fmt.Println("🍎", h.Name)
}
func (h *Human) ChangeNameAndSayHi2(name string) {
h.Name = name
fmt.Println("🍌", h.Name)
// h的类型是一个指针,照理说它是没有方法和属性的,这里h.Name相当于(*h).Name
}
网友评论