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內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!