您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么理解golang中的struct操作”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么理解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è)成員,中間沒有逗號(hào)或分號(hào),大寫的成員可以在包外訪問。
如果類型相同,也可以考慮定義在一行,例如
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)一下,按照成員名稱來初始化。
empl3 := &Employee{ ID: 3, Name: "foo", Address: "beijing", }
這時(shí)候順序不重要了,也不要求我完整性了,未直接賦值的成員繼續(xù)保留零值。
由于struct是值類型,如果作為參數(shù)傳遞的話,函數(shù)體內(nèi)接收到的是一個(gè)拷貝,所以作為函數(shù)的參數(shù)時(shí)一般用結(jié)構(gòu)體指針來傳遞。
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的每個(gè)成員都是可比較的,那么這個(gè)結(jié)構(gòu)體就是可比較的。
比較算法為:如果每個(gè)成員的值都相等,則兩個(gè)結(jié)構(gòu)體變量相等,否則不相等。
如果結(jié)構(gòu)體類型是可比較的,就意味著它可以作為map的key類型。
這是一個(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ī)中矩,沒有什么神奇的。再來看看如何使用這個(gè)結(jié)構(gòu)體
fmt.Println(manager.ManagerLevel) fmt.Println(manager.Name) //這一行 fmt.Println(manager.Employee.Name) //等同于這一行
這么折騰,不僅是一種簡化,更重要的是,我看出來了繼承的味道,但從技術(shù)上看又不存在繼承,而是組合,它即享受了繼承的好處,又避免了繼承的麻煩。
使用匿名結(jié)構(gòu)體時(shí),除了可以直接使用它的屬性以外,還可以直接使用它的方法。
感謝各位的閱讀,以上就是“怎么理解golang中的struct操作”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么理解golang中的struct操作這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。