结构体语法格式:
Go
// Point 是二维坐标点, 同时演示字段标签(tag)的写法。
type Point struct { // struct 关键字定义新类型
X int `json:"x"` // 字段标签由反射读取, json 包用它决定序列化键名
Y int `json:"y"` // 字段名必须导出(首字母大写)才会被 json 处理
} // Point 定义结束
XY是字段,对于字段的类型可以是常见的所有,包括函数
结构体专属的绑定方法,同时验证了接收者是值接收者Test和接收者是引用接收者*Test的区别
Go
type Test struct {
UserName string
UserId int
}
func (t *Test) Change() {
t.UserName = "changed"
t.UserId = 100
}
func (t Test) Change2() {
t.UserName = "changed2"
t.UserId = 200
}
func (t *Test) OutPut() {
fmt.Println(t.UserName)
fmt.Println(t.UserId)
}
func main() {
t := Test{
UserName: "one",
UserId: 0,
}
t.Change2()//change2接收者是值接收者,所以修改的数据不会映射到源
t.OutPut()
t.Change()
t.OutPut()
}
结构体可以互相嵌入,结构体a嵌入到b里面,b可以使用a的方法和属性
Go
type Test struct {
UserName string
UserId int
}
func (t *Test) Change() {
t.UserName = "changed"
t.UserId = 100
}
func (t Test) Change2() {
t.UserName = "changed2"
t.UserId = 200
}
func (t *Test) OutPut() {
fmt.Println(t.UserName)
fmt.Println(t.UserId)
}
type School struct {
Test
SchoolName string
}
func main() {
sc := new(School) //new声明结构体,所有字段默认零值
sc.SchoolName="sdws"
sc.UserId //可以直接调用
sc.Test.UserId //也可以通过字段值调用
}
同时声明,结构体没有引用传递,全部都是值传递。有部分&struc的传递传递的是指针的值。本质还是值传递