go语言—结构体其它

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":"男"}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值