Golang | 结构体的定义和使用
Struct
struct(结构体)就是用户自己定义的类型,一个结构体对应现实中的一个类型,和Java中的Class类相似,但是没有Class类那么复杂,没有多态,继承,封装。只保留了最基础的特性:组合。组合也只是形成最基本的复合类型。
初始化
自定义一个User类型,并且对这个User类型进行初始化。
type User struct {
Id int
Name string
age int
}
func initStruct() {
u1 := new(User) // 使用内置函数进行初始化
u2 := User{} // 直接初始化
u3 := &User{1,"张三",10} // 所有字段顺序初始化 不显示指定字段初始化的话,必须按顺序对所有字段进行赋值
u4 := &User{Id: 1,age: 10} // 指定字段初始化
fmt.Println(u1) // &{0 0}
fmt.Println(u2) // {0 0}
fmt.Println(u3) // &{1 张三 10}
fmt.Println(u4) // &{1 10}
}
类型初始化之后,如果结构体中的字段没有被赋值,就会被初始化该类型的零值。
我们在实际使用中,通常不使用以上的方式进行初始化结构体,一般使用一个构造函数来进行初始化:
func NewUser(id int,name string) *User {
return &User{Id: id,Name: name}
}
fmt.Println(NewUser(2,"张三")) // &{2 张三 0}
自定义的构体函数一般使用 New
开头,以结构体名称结尾,初始化时,使用几个参数传入几个参数,并且返回
可见性
结构体的可见性和包内变量是相同的,结构体名称为首字母为大写开头,别的包可以引用,字段的话,首字母为小写只能包内可见,首字母大写的话, 别的包也可见。
函名组合
type User struct {
Info
Id int
Name string
age int
}
type Info struct {
Introduction string
Name string
}
// 结构体组合
func combination() {
user := &User{Info{"组合类","李四"},1, "张三", 10}
fmt.Println(user.Name) // 组合中的同名字段,不指定的话,取外部结构体的字段
fmt.Println(user.Info.Name) // 组合中的同字段,如果想取内部结构体的字段,必须要指定内部结构体的名称进行取值
fmt.Println(user.Introduction) // 如果内部组合中字段名和外部没有重复,可以直接取这个字段输出
}
有接口的情况下,外部的结构体可以使用内部结构体的方法
如果这个结构体只使用一次,可以使用以下方法进行结构体的构造:
type User struct {
Info
TInfo struct{
Name string
}
Id int
Name string
age int
}
带标签的结构休
我们在网络传输中,需要把一个结构体转换为一个JSON字符串进行传输,我们看一下,不加标签的结构体转换为JSON字符串后的情况:
user := &User{Id: 1, age: 10} // 指定字段初始化
fmt.Println(user) // &{1 10}
jsonUser, _ := json.Marshal(user)
fmt.Println(string(jsonUser)) // {"Introduction":"","Id":1,"Name":""}
这样也可以转为JSON字符串,但是不符合我们在不同应用中传递的规范,在Go中字段名首字母为在写,转换后也是按照结构体的字段进行输出的。
如果我们想要符合规范,首字母小写,并且两个单词之间使用 _
连接,我们可以使用标签对结构体进行修改:
type User struct {
Info `json:"info"`
Id int `json:"id"`
Name string `json:"name"`
age int `json:"age"`
}
type Info struct {
Introduction string `json:"introduction"`
Name string `json:"name"`
}
{"info":{"introduction":"","name":""},"id":1,"name":""}
对结构体添加标签后,我们输出的JSON字符串就标准了。
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!