1. 程式人生 > 實用技巧 >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))
}

說明

由於結構體在操作的時候,需要注意是值變數的例項化,還是指標變數的例項化,如果是值變數的例項化,修改例項的屬性會比較麻煩,一般使用指標例項化,去修改屬性的內容