golang-面向?qū)ο缶幊?-結(jié)構(gòu)體

面向?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)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容