1、结构体匿名字段
结构体允许成员字段在声明时没有字段而只有类型,被称为匿名字段
type person struct{
string //匿名字段
int
}
func main(){
p1 := person{
"张三",
33,
}
fmt.Printf("%v", p1) //{张三 33}
fmt.Println(p1.string, p1.int) //张三 33
}
2、嵌套结构体
一个结构体中可以嵌套包含另一个结构体或结构体指针
// address结构体
type address struct{
province string
city string
}
//user结构体
type user struct{
name string
gender string
address address
}
func main(){
user1 := user{
name:"王子",
gender:"男",
address:address{
province:"广东",
city:"深圳",
},
}
fmt.Printf("%v", user1) //{王子 男 {广东 深圳}}
}
3、嵌套匿名字段
上面user结构体中嵌套的address结构体也可以使用匿名字段
// address结构体
type address struct{
province string
city string
}
//user结构体
type user struct{
name string
gender string
address //匿名字段
}
func main(){
user1 := user{
name:"王子",
gender:"男",
address:address{
"广东", //匿名字段
"深圳",
},
}
fmt.Printf("%v\n", user1) //{王子 男 {广东 深圳}}
fmt.Println(user1.address.city) //深圳 匿名字段默认使用类型名做为字段名
fmt.Println(user1.province) //匿名字段也可以省略
}
4、嵌套结构体的字段名冲突
嵌套结构体内部可能存在相同的字段名,为了避免歧义需要通过指定具体的内嵌结构体字段名
//Address 地址结构体
type Address struct {
Province string
City string
CreateTime string
}
//Email 邮箱结构体
type Email struct {
Account string
CreateTime string
}
//User 用户结构体,匿名结构体Address和Email都有相同的字段名CreatTime
type User struct {
Name string
Gender string
Address
Email
}
func main(){
var user2 User
user2.Name = "李四"
user2.Gender = "女"
user2.Address.CreateTime = "1000" //指定是Address结构体中的CreateTime,匿名字段不能省略
user2.Email.CreateTime = "2000"//指定是Email结构体中的CreateTime
}
5、结构体的“继承”
//animal结构体
type animal struct{
name string
}
//move方法,和animal结构体绑定
func(a *animal)move(){
fmt.Printf("%s在动\n",a.name)
}
//dog结构体
type dog struct{
feet int
*animal //通过嵌套匿名结构体实现继承animal
}
//wang方法,和dog结构体绑定
func(d *dog)wang(){
fmt.Printf("%s会汪汪汪~\n", d.name)
}
func main(){
//实例化dog
d1 := &dog{
feet:4,
animal:&animal{
name:"修狗",
},
}
d1.wang()
d1.move()
}
6、结构体字段的可见性
结构体中字段大些开头表示可公开访问,小写表示私有
7、结构体标签(Tag)
Json格式进行序列化及对象关系映射系统都会用到结构体标签,通过反射机制读取出来
//为Student结构体的每个字段定义json序列化时使用的Tag
type student struct{
id int `json:"id"` //通过指定tag实现json序列化该字段时的key
gender string //json序列化是默认使用字段名作为key
}
func main() {
s1 := student{
ID: 1,
Gender: "男",
}
data, err := json.Marshal(s1)
if err != nil {
fmt.Println("json marshal failed!")
return
}
fmt.Printf("json str:%s\n", data) //json str:{"id":1,"Gender":"男"}
}