golang-面向物件程式設計--結構體
阿新 • • 發佈:2020-10-10
面向物件程式設計--結構體
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))
}
說明
由於結構體在操作的時候,需要注意是值變數的例項化,還是指標變數的例項化,如果是值變數的例項化,修改例項的屬性會比較麻煩,一般使用指標例項化,去修改屬性的內容