面向?qū)ο缶幊?-結(jié)構(gòu)體
struct介紹
Go中?向?qū)ο笫峭ㄟ^struct來實現(xiàn)的, struct是?戶?定義的類型
聲明一個結(jié)構(gòu)體,User結(jié)構(gòu)體中,有屬性:Username,Sex,Age,AvatarUrl,如果屬性名稱開頭為小寫字母,那么這個屬性就是私有的,只能在當前包調(diào)用,不能挎包調(diào)用,和package中的私有函數(shù),私有變量一致
type User struct {
Username string
Sex string
Age int
AvatarUrl string
}
注意:type是?來定義?種類型
struct(結(jié)構(gòu)體)的實例化
方法一
var user User
user.Age = 18
user.Username = "user01"
user.Sex = "男"
在實例化化一個結(jié)構(gòu)體的時候,就可以設(shè)置結(jié)構(gòu)體內(nèi)的屬性值
沒有設(shè)置的值,會默認為改類型的空值
方法二
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(結(jié)構(gòu)體) 賦值指針類型
和指針類型的賦值一樣,語法:var 變量名 *結(jié)構(gòu)體 ,在初始化的時候,需要指向結(jié)構(gòu)體的內(nèi)存地址
var user *User
user = &User{}
fmt.Printf(“%p %#v\n”, user)
使用new方法,為結(jié)構(gòu)體分配內(nèi)存
var user User=new(User)
user.Username = "user01"
結(jié)構(gòu)體中的匿名字段
定義:在結(jié)構(gòu)體中沒有名字的字段
type User struct {
Username string
Sex string
Age int
AvatarUrl string
int // 直接是字段的類型,沒有字段名
string // 直接是字段的類型,沒有字段名
}
匿名字段默認采?類型名作為字段名
調(diào)用時候
var user User
user.int = 10
user.string = "1111"
結(jié)構(gòu)體的嵌套
定義:其中的一個結(jié)構(gòu)體中,擁有另一個結(jié)構(gòu)體的屬性
type Address struct {
City string
Province string
}
type User struct {
Username string
Sex string
Age int
AvatarUrl string
address Address
}
結(jié)構(gòu)體User,擁有結(jié)構(gòu)體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)
解決嵌套沖突
當一個結(jié)構(gòu)體,嵌套了多個結(jié)構(gòu)體的時候,比如C嵌套了A,也嵌套了B
- C中有屬性D的時候,使用C.D,操作這個屬性的時候,會操作C的屬性
- C中沒有屬性D,A和B中都有屬性D的時候,使用C.D,操作這個屬性的時候,編譯的時候回報錯,原因是不能明確使用的A中的還是B中的屬性,解決方法:C.A.D或者C.B.D,即使用哪個嵌套中的屬性,就寫哪個嵌套
結(jié)構(gòu)體的tag
定義: tag是結(jié)構(gòu)體的元信息,可以在運?的時候通過反射的機制讀取出來
type User struct {
Username string `json:”username”,db:”user_name”`
Sex string `json:”sex”`
Age int `json:”age”`
avatarUrl string
CreateTime string
}
字段類型后?,以反引號括起來的key-value結(jié)構(gòu)的字符串,多個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))
}
說明
由于結(jié)構(gòu)體在操作的時候,需要注意是值變量的實例化,還是指針變量的實例化,如果是值變量的實例化,修改實例的屬性會比較麻煩,一般使用指針實例化,去修改屬性的內(nèi)容