一、结构体定义和初始化
1.通过new和&{}的初始化方式获取的是结构体指针类型
package main
import "fmt"
type Person struct {
id int
name string
}
func main() {
var p1 Person
p1.id = 100
p1.name = "Sam"
p2 := new(Person)
p2.id = 200
p2.name = "Tom"
p3 := &Person{
id : 300,
name : "TT",
}
fmt.Println(p1)
fmt.Println(p2)
fmt.Println(p3)
}

二、结构体使用易错点
1.结构体与sync.Map共同使用,空接口转换时,要与Store到Map时的结构体类型一致(值类型还是指针类型)
package main
import (
"fmt"
"sync"
)
type Person struct {
id int
name string
}
func main() {
var tab sync.Map
var p1 Person
p2 := new(Person)
p1.id = 1
p1.name = "Sam"
p2.id = 2
p2.name = "Tom"
tab.Store(1, p1)
tab.Store(2, p2)
if value, ok := tab.Load(1); ok {
node1 := value.(Person)
fmt.Println(node1)
}
if value, ok := tab.Load(2); ok {
node2 := value.(*Person)
fmt.Println(node2)
}
}

2.结构体比较的易错点
- (1)12行的结构体类型比较会正常输出
- (2)24行的结构体类型比较会编译报错
- (3)结构体类型只能比较常规类型布尔、字符串、指针、整型等,但凡成员变成map、slice、channel等类型,则不可比较类型
- (4)如果结构体成员顺序不一致,也会导致结构体类型不一致
