最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言中的Struct結(jié)構(gòu)體

 更新時(shí)間:2022年07月16日 15:06:50   作者:奮斗的大橙子  
這篇文章介紹了Go語(yǔ)言中的Struct結(jié)構(gòu)體,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、Struct結(jié)構(gòu)體

Go語(yǔ)言中沒有像C#、Java一樣的Class,只有Struct這樣的結(jié)構(gòu)體。Go語(yǔ)言使用type關(guān)鍵字來定義一個(gè)類型。

如下:

type User struct {
   Name string
   Age int32
   Sex int16
   AvatarUrl string
}

二、Struct的聲明以及初始化

初始化方法一:直接定義,通過變量名.成員名的方式賦值

//初始化方法1
var user1 User
user1.Name = "BigOrange"
user1.Age = 20
user1.Sex = 1
user1.AvatarUrl = "xxxxxxx"
 
fmt.Println("User1:",user1)

初始化方法二:直接通過{}進(jìn)行初始化,這點(diǎn)和C#不一樣,C#初始化的時(shí)候一般用new,例如 var user = new User{xxxxx,xxxxx,xxxx}

//初始化方法2
var user2 User = User{
   Name:"BigBanana",
   Age:23,
   Sex:0,
   AvatarUrl:"yyyyyyyyyyy",
}
 
fmt.Println("User2:",user2)
 
//初始化方法2簡(jiǎn)化
 user3 := User{
   Name:"BigBanana",
   Age:23,
   Sex:0,
   AvatarUrl:"yyyyyyyyyyy",
}
 
fmt.Println("User3:",user3)

三、Struct的指針

Struct的指針比較簡(jiǎn)單,就是通過&獲取地址,此外還可以用new來返回一個(gè)對(duì)象的指針

方式一

var user4 *User = &User{
    Name:"BigPeach",
    Age:22,
    Sex:1,
    AvatarUrl:"zzzzzzz",
 }
 
fmt.Println("User4:",user4)
fmt.Println("User4:",*user4)

方式二

user5 := new(User)
user5.Name="BigGrape"
user5.Age= 25
user5.Sex= 1
user5.AvatarUrl= "mmmmmmmmm"
fmt.Println("User5:",user5)
fmt.Println("User5:",*user5)

上面第二種方式可能會(huì)有些疑問,user5不是一個(gè)指針類型嗎?怎么和上面的值類型一樣直接用【變量名.成員】 的方式進(jìn)行賦值了呢? 不是應(yīng)該 (*user5).Name 這樣嗎?沒有錯(cuò)!

這是GO語(yǔ)言實(shí)現(xiàn)的一個(gè)語(yǔ)法糖,實(shí)際上GO語(yǔ)言會(huì)幫我轉(zhuǎn)換。

四、Struct成員的內(nèi)存布局以及實(shí)現(xiàn)構(gòu)造函數(shù)

例如下面這樣的一段代碼

package main
 
import "fmt"
 
type AddressDemo struct {
   addr1 int32
   addr2 int32
   addr3 int32
}
 
func main(){
   addr := new(AddressDemo)
   fmt.Println("add1地址:",&addr.addr1)
   fmt.Println("add2地址:",&addr.addr2)
   fmt.Println("add3地址:",&addr.addr3)
}

結(jié)果:

add1地址: 0xc042060080
add2地址: 0xc042060084
add3地址: 0xc042060088

可以看出來,addr1、addr2、addr3都是int32,都是占用了4個(gè)字節(jié),他們的地址分配都是連續(xù)的。

For example: 下面這個(gè)User包,就實(shí)現(xiàn)了一個(gè)NewUser的方法,他就是構(gòu)造函數(shù)

package User
 
type User struct {
   Name string
   Age int32
   Sex int16
   AvatarUrl string
}
 
func NewUser(name string , age int32,sex int16,avatarUrl string) *User{
   user:=new(User)
   user.Name = name
   user.Age = age
   user.Sex = sex
   user.AvatarUrl = avatarUrl
 
   return user
}

五、Struct中的匿名字段和嵌套

可以像下面這樣聲明:后兩個(gè)字段沒有名字

type Class struct {
   Name string
   int
   string
}

使用的時(shí)候,對(duì)于匿名的字段,直接賦值就可以了

class1:=Class{
   Name:"Class1",
   int:123,
   string:"sssssss",
}
 
fmt.Println("class1:",class1)

結(jié)構(gòu)體的嵌套

type User struct {
   Name string
   Age int32
   Sex int16
   AvatarUrl string
}
 
type Class struct {
   Name string
}
 
type Student struct {
   User User
   Class Class
}

使用:

func main() {
   stu:=new(User.Student)
    
   stu.Class = User.Class{
      Name:"5-2",
   }
    
   stu.User = User.User {
       Name:"BigBanana",
      Sex:1,
      Age:12,
      AvatarUrl:"asdasdasd",
   }
    
   fmt.Println(stu)
}

如果是匿名結(jié)構(gòu)體嵌套呢?修改一下Student

type Student struct {
   User User
   Class
}

使用在對(duì)Class這個(gè)成員進(jìn)行賦值的時(shí)候,可以發(fā)現(xiàn),既可以使用

stu.Class = User.Class{
   Name:"5-2",
}

也可以使用Name直接賦值,順序就是現(xiàn)在當(dāng)前的結(jié)構(gòu)體找,找不到再?gòu)哪涿Y(jié)構(gòu)體中查找,正好找到Class里面有Name

stu.Name = "5-2"

如果Class和User都是匿名結(jié)構(gòu)嵌套,但是他們里面都有Name,當(dāng)我們使用stu.Name的時(shí)候,那他訪問的是Class里的Name還是User里面的Name? 那么豈不是沖突了? 如何處理沖突?

當(dāng)我試圖給stu.Name賦值的時(shí)候,編譯器報(bào)錯(cuò)了,內(nèi)容如下,也就是它找不到應(yīng)該給誰(shuí)賦值。

這時(shí)候要解決這個(gè)沖突,必須指定是哪個(gè)匿名字段里面的Name

stu:=new(User.Student)
 
stu.User.Name = "123123"
stu.Class.Name = "5-2"
 
stu.User = User.User {
   Name:"BigBanana",
   Sex:1,
   Age:12,
   AvatarUrl:"asdasdasd",
}

六、結(jié)構(gòu)體內(nèi)字段的可見性

和包一樣,小寫的字段外部不可見,大寫的外部可見

七、結(jié)構(gòu)體的Tag

tag是結(jié)構(gòu)體的元信息,可以在運(yùn)行的時(shí)候通過反射的機(jī)制讀出來。

怎么寫tag?

以`作為開頭和結(jié)尾,中間是key-value形式的字符串,每一個(gè)鍵值對(duì)以,作為分隔。例如

type User struct {
   UserName string   `json:"userName",db:"User_Name"`
   Age int32         `json:"age"`
   Sex int16         `json:"sex"`
   AvatarUrl string  `json:"avatarUrl",db:"Avatar_Url"`
}

使用并運(yùn)行:

func main() {

   user := User.User {
      UserName:"BigBanana",
      Sex:1,
      Age:12,
      AvatarUrl:"asdasdasd",
   }

   fmt.Println(user)

   data,_:=json.Marshal(user)

   fmt.Println(string(data))
   
}

結(jié)果:

{"userName":"BigBanana","age":12,"sex":1,"avatarUrl":"asdasdasd"}

可以看到,如果打了這個(gè)tag,會(huì)顯示tag后面的標(biāo)記名稱。

此外:如果字段名稱是小寫,那么json輸出的時(shí)候就不會(huì)有這個(gè)字段被打印了。

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 在go中進(jìn)行單元測(cè)試的案例分享

    在go中進(jìn)行單元測(cè)試的案例分享

    這篇文章主要介紹了使用Go進(jìn)行單元測(cè)試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • golang中interface接口的深度解析

    golang中interface接口的深度解析

    什么是interface,簡(jiǎn)單的說,interface是一組method的組合,下面這篇文章主要給大家深度解析了關(guān)于golang中的interface接口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn)

    goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn)

    本文主要介紹了goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Golang中這些channel用法你了解嗎

    Golang中這些channel用法你了解嗎

    channel?是GO語(yǔ)言中一種特殊的類型,是連接并發(fā)goroutine的管道,這篇文章主要來和大家分享一下關(guān)于?nil?channel?通道,有緩沖通道,無(wú)緩沖通道的常用方法以及巧妙使用的方式,希望對(duì)大家有所幫助
    2023-08-08
  • 深入理解golang的異常處理機(jī)制

    深入理解golang的異常處理機(jī)制

    Go語(yǔ)言追求簡(jiǎn)潔優(yōu)雅,所以,Go語(yǔ)言不支持傳統(tǒng)的 try…catch…finally 這種異常,下面這篇文章主要給大家介紹了關(guān)于golang的異常處理機(jī)制,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • 使用Go語(yǔ)言解析動(dòng)態(tài)JSON格式的方法

    使用Go語(yǔ)言解析動(dòng)態(tài)JSON格式的方法

    本篇文章主要介紹了使用Go語(yǔ)言解析動(dòng)態(tài)JSON格式的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn)

    GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn)

    本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 基于Go語(yǔ)言實(shí)現(xiàn)一個(gè)壓測(cè)工具

    基于Go語(yǔ)言實(shí)現(xiàn)一個(gè)壓測(cè)工具

    這篇文章主要為大家詳細(xì)介紹了基于Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的壓測(cè)工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • golang gin 監(jiān)聽rabbitmq隊(duì)列無(wú)限消費(fèi)的案例代碼

    golang gin 監(jiān)聽rabbitmq隊(duì)列無(wú)限消費(fèi)的案例代碼

    這篇文章主要介紹了golang gin 監(jiān)聽rabbitmq隊(duì)列無(wú)限消費(fèi),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 一文搞懂Go?Exec?僵尸與孤兒進(jìn)程

    一文搞懂Go?Exec?僵尸與孤兒進(jìn)程

    本文主要介紹了Go?Exec?僵尸與孤兒進(jìn)程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論

东丰县| 福清市| 友谊县| 扬中市| 克什克腾旗| 宜城市| 米脂县| 会泽县| 松江区| 汕尾市| 石台县| 武功县| 衡东县| 改则县| 宁河县| 鄂伦春自治旗| 海安县| 怀化市| 当雄县| 肇东市| 津市市| 新田县| 屏山县| 惠来县| 马山县| 潢川县| 宣城市| 宿松县| 高邑县| 额敏县| 淳化县| 商丘市| 苏州市| 闵行区| 游戏| 静宁县| 开封市| 藁城市| 江油市| 杭锦旗| 松潘县|