91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解golang中的struct操作

發布時間:2021-11-10 14:10:42 來源:億速云 閱讀:176 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么理解golang中的struct操作”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么理解golang中的struct操作”吧!

struct是實現面向對象的重要技術,基本上都跟類型聲明type name underlying-type結合使用。

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

聲明

type Employee struct {
    ID      int
    Name    string
    Address string
}

一行一個成員,中間沒有逗號或分號,大寫的成員可以在包外訪問。

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

type Employee struct {
    ID            int
    Name, Address string
}

結構體中不能定義同名結構體的成員,但可以定義同名結構體的指針類型的成員,例如

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

初始化

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

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

還可以更快地初始化

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

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

由于struct成員可能會調整,所以上面的代碼就顯得有些脆弱,下面改進一下,按照成員名稱來初始化。

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

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

與指針相關的操作

由于struct是值類型,如果作為參數傳遞的話,函數體內接收到的是一個拷貝,所以作為函數的參數時一般用結構體指針來傳遞。

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

在使用struct指針類型的變量時,可以省略*,看上去就像struct是引用類型一樣,其實它是一個結構體指針。

下面的函數初始化一個struct,并返回了它的指針

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

struct的可比較性

如果struct的每個成員都是可比較的,那么這個結構體就是可比較的。

比較算法為:如果每個成員的值都相等,則兩個結構體變量相等,否則不相等。

如果結構體類型是可比較的,就意味著它可以作為map的key類型。

結構體嵌套和匿名成員

這是一個神奇的機制,當在結構體里面聲明一個匿名結構體時,使用這個匿名結構體的成員時,就可以省略匿名結構體的名字,就好像當前的結構體擁有這個匿名結構體的成員一樣。

下面的結構體,EmployeeManager,將上面的結構體Employee作為一個匿名成員

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

初始化匿名成員:

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

看上去中規中矩,沒有什么神奇的。再來看看如何使用這個結構體

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

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

使用匿名結構體時,除了可以直接使用它的屬性以外,還可以直接使用它的方法。

感謝各位的閱讀,以上就是“怎么理解golang中的struct操作”的內容了,經過本文的學習后,相信大家對怎么理解golang中的struct操作這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荥经县| 昭通市| 金湖县| 黄冈市| 永胜县| 富阳市| 曲麻莱县| 金平| 湟源县| 梁河县| 和林格尔县| 澄江县| 蒙城县| 临澧县| 吉首市| 陇川县| 大埔县| 兰州市| 阿尔山市| 沁阳市| 河池市| 宝鸡市| 盈江县| 德保县| 宽城| 黔江区| 正镶白旗| 金平| 黄梅县| 清原| 剑河县| 上杭县| 城步| 浦城县| 陆良县| 樟树市| 扶绥县| 绥滨县| 济源市| 琼中| 顺昌县|