type s struct乙個命名為s的結構體型別將不能再包含s型別的成員:因為乙個聚合的值不能包含它自身。(該限制同樣適應於陣列。)但是s型別的結構體可以包含
*s
指標型別的成員,這可以讓我們建立遞迴的資料結構,比如鍊錶和樹結構等。
如果結構體沒有任何成員的話就是空結構體,寫作struct{}。它的大小為0,也不包含任何資訊,但是有時候依然是有價值的。有些go語言程式設計師用map帶模擬set資料結構時,用它來代替map中布林型別的value,只是強調key的重要性,但是因為節約的空間有限,而且語法比較複雜,所有我們通常避免避免這樣的用法。
seen := make(map[string]struct{}) // set of strings
// ...
if _, ok := seen[s]; !ok {}
// ...first time seeing s...
}
結構體可以作為函式的引數和返回值,如果結構體較大,一般使用指標引數,而且如果要在函式修改結構體,則必須使用指標形式。go語言中所有的函式引數都是值拷貝。得意於匿名嵌入的特性,我們可以直接訪問葉子屬性而不需要給出完整的路徑:如果結構體的全部成員都是可比較的,則該結構體也可比較,則可作為map的key型別。
var w wheel
w.x = 8 // equivalent to w.circle.point.x = 8
w.y = 8 // equivalent to w.circle.point.y = 8
w.radius = 5 // equivalent to w.circle.radius = 5
w.spokes = 20
不幸的是,結構體字面值並沒有簡短表示匿名成員的語法, 因此下面的語句都不能編譯通過:
w = wheel // compile error: unknown fields
w = wheel // compile error: unknown fields
到目前為止,我們看到匿名成員特性只是對訪問巢狀成員的點運算子提供了簡短的語法糖。稍後,我們將會看到匿名成員並不要求是結構體型別;其實任何命令的型別都可以作為結構體的匿名成員。但是為什麼要嵌入乙個沒有任何子成員型別的匿名成員型別呢?
答案是匿名型別的方法集。簡短的點運算子語法可以用於選擇匿名成員巢狀的成員,也可以用於訪問它們的方法。實際上,外層的結構體不僅僅是獲得了匿名成員型別的所有成員,而且也獲得了該型別匯出的全部的方法。這個機制可以用於將乙個有簡單行為的物件組合成有複雜行為的物件。組合是go語言中物件導向程式設計的核心
結體體定義時,可以為每乙個字段新增乙個 tag,比如使用內建json庫時,就可能用到這個tag。具體看元資料和反射。
golang struct繼承測試
記錄下golang struct的繼承關係 package main import fmt func main type a struct type b struct func a a afunc func a a bfunc func b b afunc func b b cfunc func t...
Golang Struct 宣告和使用
golang struct 宣告和使用 go可以宣告自定義的資料型別,組合乙個或多個型別,可以包含內建型別和使用者自定義的型別,可以像內建型別一樣使用struct型別 struct 宣告 具體的語法 type identifier struct例子 package main import fmt t...
通俗的理解遞
在學習遞迴的過程中,個人感覺真的晦澀難懂,遞迴就是函式自己呼叫自己。遞迴程式的基本步驟 1.初始化演算法。遞迴程式通常需要乙個開始時使用的種子值 seed value 2.要完成此任務,可以向函式傳遞引數,或者提供乙個入口函式,這個函式是非遞迴的,但可以為遞迴計算設定種子值。3.檢查要處理的當前值是...