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

golang中的struct操作

 更新時(shí)間:2021年11月10日 11:29:13   作者:老朱.  
結(jié)構(gòu)體是一種聚合的數(shù)據(jù)類型,是由零個(gè)或多個(gè)任意類型的值聚合成的實(shí)體,每個(gè)值稱為結(jié)構(gòu)體的成員。下面介紹下golang中的struct,感興趣的朋友一起看看吧

struct是實(shí)現(xiàn)面向?qū)ο蟮闹匾夹g(shù),基本上都跟類型聲明type name underlying-type結(jié)合使用。

struct是值類型,所以它的零值是所有成員的零值。由于值類型在作為函數(shù)參數(shù)時(shí)的局限性,所以經(jīng)常配合指針一起使用。

聲明

type Employee struct {
    ID      int
    Name    string
    Address string
}

一行一個(gè)成員,中間沒(méi)有逗號(hào)或分號(hào),大寫的成員可以在包外訪問(wèn)。

如果類型相同,也可以考慮定義在一行,例如

type Employee struct {
    ID            int
    Name, Address string
}

結(jié)構(gòu)體中不能定義同名結(jié)構(gòu)體的成員,但可以定義同名結(jié)構(gòu)體的指針類型的成員,例如

type Employee struct {
    ID            int
    Name, Address string
	   Leader        *Employee		
}

初始化

可以在聲明時(shí)直接初始化,也可以聲明后再一個(gè)個(gè)賦值。先看一個(gè)最直接的方式。

var empl Employee
empl.ID = 1
empl.Name = "foo"
empl.Address = "nanshan"

還可以更快地初始化

empl2 := Employee{2, "foo", "nanshan"}

所以,聲明成員的順序非常重要。上面初始化的值必須與struct的成員一一對(duì)應(yīng),不多不少,類型上可賦值。

由于struct成員可能會(huì)調(diào)整,所以上面的代碼就顯得有些脆弱,下面改進(jìn)一下,按照成員名稱來(lái)初始化。

empl3 := &Employee{
    ID:      3,
    Name:    "foo",
    Address: "beijing",
}

這時(shí)候順序不重要了,也不要求我完整性了,未直接賦值的成員繼續(xù)保留零值。

與指針相關(guān)的操作

由于struct是值類型,如果作為參數(shù)傳遞的話,函數(shù)體內(nèi)接收到的是一個(gè)拷貝,所以作為函數(shù)的參數(shù)時(shí)一般用結(jié)構(gòu)體指針來(lái)傳遞。

emplPtr := &empl
emplPtr.Name = "bar" 		// 等同于 (*emplPtr).Name = "bar"

在使用struct指針類型的變量時(shí),可以省略*,看上去就像struct是引用類型一樣,其實(shí)它是一個(gè)結(jié)構(gòu)體指針。

下面的函數(shù)初始化一個(gè)struct,并返回了它的指針

func EmployeeById(id int) *Employee {
    return &Employee{
        ID:      id,
        Name:    "foo",
        Address: "beijing",
    }
}

struct的可比較性

如果struct的每個(gè)成員都是可比較的,那么這個(gè)結(jié)構(gòu)體就是可比較的。

比較算法為:如果每個(gè)成員的值都相等,則兩個(gè)結(jié)構(gòu)體變量相等,否則不相等。

如果結(jié)構(gòu)體類型是可比較的,就意味著它可以作為map的key類型。

結(jié)構(gòu)體嵌套和匿名成員

這是一個(gè)神奇的機(jī)制,當(dāng)在結(jié)構(gòu)體里面聲明一個(gè)匿名結(jié)構(gòu)體時(shí),使用這個(gè)匿名結(jié)構(gòu)體的成員時(shí),就可以省略匿名結(jié)構(gòu)體的名字,就好像當(dāng)前的結(jié)構(gòu)體擁有這個(gè)匿名結(jié)構(gòu)體的成員一樣。

下面的結(jié)構(gòu)體,EmployeeManager,將上面的結(jié)構(gòu)體Employee作為一個(gè)匿名成員

type EmployeeManager struct {
    Employee                // 匿名成員
    ManagerLevel int
}

初始化匿名成員:

var manager = EmployeeManager{
    Employee: Employee{
        ID:      2,
        Name:    "fooManager",
        Address: "beijing",
    },
    ManagerLevel: 4,
}

看上去中規(guī)中矩,沒(méi)有什么神奇的。再來(lái)看看如何使用這個(gè)結(jié)構(gòu)體

fmt.Println(manager.ManagerLevel)
fmt.Println(manager.Name)				//這一行
fmt.Println(manager.Employee.Name)		//等同于這一行

這么折騰,不僅是一種簡(jiǎn)化,更重要的是,我看出來(lái)了繼承的味道,但從技術(shù)上看又不存在繼承,而是組合,它即享受了繼承的好處,又避免了繼承的麻煩。

使用匿名結(jié)構(gòu)體時(shí),除了可以直接使用它的屬性以外,還可以直接使用它的方法。

到此這篇關(guān)于golang中的struct的文章就介紹到這了,更多相關(guān)golang中struct內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang?中的json.Marshal問(wèn)題總結(jié)(推薦)

    Golang?中的json.Marshal問(wèn)題總結(jié)(推薦)

    這篇文章主要介紹了Golang中的json.Marshal問(wèn)題總結(jié),本文通過(guò)一個(gè)例子給大家詳細(xì)講解,本次提出的問(wèn)題中,我們不難注意到其中的time.Time是一個(gè)匿名(Anonymous)字段,而這個(gè)就是答案的由來(lái),需要的朋友可以參考下
    2022-06-06
  • 解決電腦用GoLand太卡將VsCode定制成Go IDE步驟過(guò)程

    解決電腦用GoLand太卡將VsCode定制成Go IDE步驟過(guò)程

    這篇文章主要為大家介紹了解決電腦用GoLand太卡,將VsCode定制成Go IDE步驟過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 使用Go語(yǔ)言實(shí)現(xiàn)LRU緩存的代碼詳解

    使用Go語(yǔ)言實(shí)現(xiàn)LRU緩存的代碼詳解

    在日常開發(fā)中,緩存是提高系統(tǒng)性能的重要手段,LRU緩存是一種基于“最近最少使用”策略的緩存系統(tǒng),其目的是在空間受限的情況下保留最新、最常用的數(shù)據(jù),本文將詳細(xì)講解如何使用?Go?語(yǔ)言實(shí)現(xiàn)一個(gè)?LRU?緩存,需要的朋友可以參考下
    2024-11-11
  • GoLang逃逸分析講解

    GoLang逃逸分析講解

    我們都知道go語(yǔ)言中內(nèi)存管理工作都是由Go在底層完成的,這樣我們可以不用過(guò)多的關(guān)注底層的內(nèi)存問(wèn)題。本文主要總結(jié)一下?Golang內(nèi)存逃逸分析,需要的朋友可以參考以下內(nèi)容,希望對(duì)大家有幫助
    2022-12-12
  • golang 實(shí)現(xiàn)并發(fā)求和

    golang 實(shí)現(xiàn)并發(fā)求和

    這篇文章主要介紹了golang 并發(fā)求和的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Goland 斷點(diǎn)調(diào)試Debug的操作

    Goland 斷點(diǎn)調(diào)試Debug的操作

    這篇文章主要介紹了Goland 斷點(diǎn)調(diào)試Debug的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang常用的幾種密碼加密方式分享

    Golang常用的幾種密碼加密方式分享

    這篇文章給大家介紹了Golang常用的幾種密碼加密方式,加密有兩種方式,一種是直接加密,一種是鹽值加密,直接加密指的是將原始密碼直接進(jìn)行加密,鹽值加密則是在進(jìn)行密碼加密之前,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • Go無(wú)緩沖通道(同步通道)的實(shí)現(xiàn)

    Go無(wú)緩沖通道(同步通道)的實(shí)現(xiàn)

    本文主要介紹了Go無(wú)緩沖通道(同步通道)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 一文詳解Go語(yǔ)言中對(duì)象池的正確打開方式

    一文詳解Go語(yǔ)言中對(duì)象池的正確打開方式

    對(duì)象池是一種設(shè)計(jì)模式,它維護(hù)一組已經(jīng)創(chuàng)建好的對(duì)象,當(dāng)需要使用對(duì)象時(shí),直接從對(duì)象池中獲取,使用完畢后再放回對(duì)象池,而不是頻繁地創(chuàng)建和銷毀對(duì)象,下面我們就來(lái)看看Go語(yǔ)言中對(duì)象池的具體使用吧
    2025-02-02
  • GO語(yǔ)言基礎(chǔ)庫(kù)os包的函數(shù)全面解析

    GO語(yǔ)言基礎(chǔ)庫(kù)os包的函數(shù)全面解析

    這篇文章主要為大家介紹了GO語(yǔ)言基礎(chǔ)庫(kù)os包的函數(shù)全面解析, 有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

湖南省| 册亨县| 弥渡县| 玉山县| 炉霍县| 芦山县| 永寿县| 龙川县| 南丰县| 新乡县| 都江堰市| 瑞丽市| 德庆县| 江达县| 岳阳市| 陇南市| 安达市| 板桥市| 怀集县| 涿鹿县| 宁明县| 资源县| 榆社县| 贺州市| 客服| 茂名市| 五台县| 桂平市| 龙胜| 咸阳市| 镇平县| 吉林省| 汕尾市| 黄龙县| 界首市| 砚山县| 友谊县| 高陵县| 松阳县| 赤水市| 麻阳|