golang-面向对象编程–结构体

微信扫一扫,分享到朋友圈

golang-面向对象编程–结构体

面向对象编程–结构体

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))
}

说明

由于结构体在操作的时候,需要注意是值变量的实例化,还是指针变量的实例化,如果是值变量的实例化,修改实例的属性会比较麻烦,一般使用指针实例化,去修改属性的内容

有疑问加站长微信联系

高效Transformer层出不穷,谷歌团队综述文章一网打尽

上一篇

小红书最受欢迎的“合集类”笔记怎么写?

下一篇

你也可能喜欢

golang-面向对象编程–结构体

长按储存图像,分享给朋友