面向对象编程--结构体
struct介绍
Go中⾯向对象是通过struct来实现的, struct是⽤户⾃定义的类型
声明一个结构体,User结构体中,有属性:Username,Sex,Age,AvatarUrl,如果属性名称开头为小写字母,那么这个属性就是私有的,只能在当前包调用,不能挎包调用,和package中的私有函数,私有变量一致
type User struct {
Username string
Sex string
Age int
AvatarUrl string
}
注意:type是⽤来定义⼀种类型
struct(结构体)的实例化
方法一
var user User
user.Age = 18
user.Username = "user01"
user.Sex = "男"
在实例化化一个结构体的时候,就可以设置结构体内的属性值
没有设置的值,会默认为改类型的空值
方法二
var user User = User {
“Username” : “user01”,
“Age”: 18,
“Sex”: “男”,
“AvatarUrl”: “http://my.com/xxx.jpg”,
}
更简洁的方法
user = User {
“Username” : “user01”,
“Age”: 18,
“Sex”: “男”,
“AvatarUrl”: “http://my.com/xxx.jpg”,
}
struct(结构体) 赋值指针类型
和指针类型的赋值一样,语法:var 变量名 *结构体 ,在初始化的时候,需要指向结构体的内存地址
var user *User
user = &User{}
fmt.Printf(“%p %#v\n”, user)
使用new方法,为结构体分配内存
var user User=new(User)
user.Username = "user01"
结构体中的匿名字段
定义:在结构体中没有名字的字段
type User struct {
Username string
Sex string
Age int
AvatarUrl string
int // 直接是字段的类型,没有字段名
string // 直接是字段的类型,没有字段名
}
匿名字段默认采⽤类型名作为字段名
调用时候
var user User
user.int = 10
user.string = "1111"
结构体的嵌套
定义:其中的一个结构体中,拥有另一个结构体的属性
type Address struct {
City string
Province string
}
type User struct {
Username string
Sex string
Age int
AvatarUrl string
address Address
}
结构体User,拥有结构体Address中的所有属性
var user User = User{
Username: "user01",
Age: 10,
address: Address{
City: "bj",
Province: "bj1",
},
}
fmt.Printf("user info: Username : %s,Age: %d,City:%s,Province:%s", user.Username, user.Age, user.address.City, user.address.Province)
解决嵌套冲突
当一个结构体,嵌套了多个结构体的时候,比如C嵌套了A,也嵌套了B
- C中有属性D的时候,使用C.D,操作这个属性的时候,会操作C的属性
- C中没有属性D,A和B中都有属性D的时候,使用C.D,操作这个属性的时候,编译的时候回报错,原因是不能明确使用的A中的还是B中的属性,解决方法:C.A.D或者C.B.D,即使用哪个嵌套中的属性,就写哪个嵌套
结构体的tag
定义: tag是结构体的元信息,可以在运⾏的时候通过反射的机制读取出来
type User struct {
Username string `json:”username”,db:”user_name”`
Sex string `json:”sex”`
Age int `json:”age”`
avatarUrl string
CreateTime string
}
字段类型后⾯,以反引号括起来的key-value结构的字符串,多个tag以逗号隔开
tag的作用,是可以再json序列化的时候,定义json中key的值
type User struct {
Username string `json:"username",db:"user_name"`
Age int `json:"age"`
Sex string `json:"sex"`
}
func main() {
user := User{
Username: "user01",
Age: 19,
Sex: "man",
}
data, _ := json.Marshal(user)
fmt.Printf("user : %s\n", string(data))
}
说明
由于结构体在操作的时候,需要注意是值变量的实例化,还是指针变量的实例化,如果是值变量的实例化,修改实例的属性会比较麻烦,一般使用指针实例化,去修改属性的内容
有疑问加站长微信联系(非本文作者)