目录:
- struct声明和定义
- struct的内存布局以及构造函数
- 匿名字段和struct嵌套
- struct与tag应用
struct声明和定义
1、Go中面向对象是通过struct来实现的, struct是用户自定义的类型。
type User struct {
Username string
Sex string
Age int
AvatarUrl string
}
注意:type是⽤用来定义一种类型
2、struct初始化⽅方法1
var user User
user.Age = 18
user.Username = “user01”
user.Sex = “男”
user.AvatarUrl = “http://my.com/xxx.jpg"
注意:使⽤用变量量名+ ‘.’ + 字段名访问结构体中的字段
3、 struct初始化方法2
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”,
}
4、struct初始化的默认值
var user User
fmt.Printf(“%#v\n”, user)
5、结构体类型的指针
var user *User = &User{}
fmt.Printf(“%p %#v\n”, user)
var user *User = &User {
“Username” : “user01”,
“Age”: 18,
“Sex”: “男”,
“AvatarUrl”: “http://my.com/xxx.jpg”,
}
var user User = new(User)
user.Age = 18
user.Username = “user01”
user.Sex = “男”
user.AvatarUrl = “http://my.com/xxx.jpg"
struct的内存布局以及构造函数
1、结构体的内存布局: 占用一段连续的内存空间
2、结构体没有构造函数, 必要时需要自己实现
package main import "fmt" // struct定义
type User struct {
Username string
Sex int
Age int
AvatarUrl string
} func main() {
// 初始化
var user User
user.Age = 18
user.AvatarUrl = "http://baidu.com/image/xxx.jpg"
user.Sex = '男'
user.Username = "user01" fmt.Printf("user.username=%s age=%d sex=%s avatar=%s\n", user.Username, user.Age, user.Sex, user.AvatarUrl) // 初始化方法2
var user2 = User{
Username: "user02",
Age: 18,
Sex: '女',
AvatarUrl: "http://xxx.baidu.com/image/xxx.jpg",
} fmt.Printf("user2=%#v\n", user2) }
匿名字段和struct嵌套
1、匿名字段: 即没有名字的字段
type User struct {
Username string
Sex string
Age int
AvatarUrl string
} // 匿名字段
type User struct {
Username string
Sex string
Age int
AvatarUrl string
int
string
}
注意:匿名字段默认采⽤用类型名作为字段名
2、结构体嵌套
type Address struct {
City string
Province string
} type User struct {
Username string
Sex string
Age int
AvatarUrl string
address Address
}
3、匿名结构体
type Address struct {
City string
Province string
} type User struct {
Username string
Sex string
Age int
AvatarUrl string
Address
}
4、匿名结构体与继承
type Animal struct {
City string
Province string
} type User struct {
Username string
Sex string
Age int
AvatarUrl string
Address
}
5、冲突解决
type Address struct {
City string
Province string
CreateTime string
} type Email struct {
Account string
CreateTime string
} type User struct {
Username string
Sex string
Age int
AvatarUrl string
Address
CreateTime string
}
struct与tag应用
1、字段可见性,大写表示可公开访问,小写表示私有
type User struct {
Username string
Sex string
Age int
avatarUrl string
CreateTime string
}
2、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以逗号隔开。