您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關golang的結構體,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
定義:是一種聚合的數據類型,是由零個或多個任意類型的值聚合成的實體。
成員:每個值稱為結構體的成員。
示例:
用結構體的經典案例處理公司的員工信息,每個員工信息包含一個唯一的員工編號、員工的名字、家庭住址、出生日期、工作崗位、薪資、上級領導等等。所有的這些信息都需要綁定到一個實體中,可以作為一個整體單元被復制,作為函數的參數或返回值,或者是被存儲到數組中,等等。
定義結構體:
type Employee struct { ID int Name string Address string DoB time.Time Position string Salary int ManagerID int }
定義變量:
var dilbert Employee
訪問成員:
dilbert.Salary -= 5000
取成員地址:
position := &dilbert.Position *position = "Senior " + *position
點操作符與指向結構體的指針:
var employeeOfTheMonth *Employee = &dilbert employeeOfTheMonth.Position += " (proactive team player)"
成員定義順序:
通常一行對應一個結構體成員,成員的名字在前類型在后,不過如果相鄰的成員類型如果相同的話可以被合并到一行,就像下面的Name和Address成員那樣
type Employee struct { ID int Name, Address string DoB time.Time Position string Salary int ManagerID int }
成員命名規則:
如果結構體成員名字是以大寫字母開頭的,那么該成員就是導出的;這是Go語言導出規則決定的。一個結構體可能同時包含導出和未導出的成員。
導出含義:在其他包中可進行讀寫。
一個命名為S的結構體類型將不能再包含S類型的成員:因為一個聚合的值不能包含它自身。(該限制同樣適應于數組。)但是S類型的結構體可以包含*S指針類型的成員,這可以讓我們創建遞歸的數據結構,比如鏈表和樹結構等。
type tree struct { value int left, right *tree }
結構體面值:
可以指定每個成員的值。
type Point struct{ X, Y int } p := Point{1, 2}
上面的是第一種寫法,要求以結構體成員定義的順序為每個結構體成員指定一個面值。還可以:
anim := gif.GIF{LoopCount: nframes}
以成員名字和相應的值來初始化,可以包含部分或全部的成員;在這種形式的結構體面值寫法中,如果成員被忽略的話將默認用零值。因為,提供了成員的名字,所有成員出現的順序并不重要。
注意:兩種不同形式的寫法不能混合使用。
結構體嵌入和匿名成員:
type Point struct { X, Y int } type Circle struct { Center Point Radius int } type Wheel struct { Circle Circle Spokes int }
訪問每個成員:
var w Wheel w.Circle.Center.X = 8 w.Circle.Center.Y = 8 w.Circle.Radius = 5 w.Spokes = 20
在次簡化結構體定義:
type Circle struct { Point Radius int } type Wheel struct { Circle Spokes int }
得意于匿名嵌入的特性,我們可以直接訪問葉子屬性而不需要給出完整的路徑:
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{Circle{Point{8, 8}, 5}, 20} w = Wheel{ Circle: Circle{ Point: Point{X: 8, Y: 8}, Radius: 5, }, Spokes: 20, // NOTE: trailing comma necessary here (and at Radius) }
結構體tag:
在結構體聲明中,Year和Color成員后面的字符串面值是結構體成員Tag
type Movie struct { Title string Year int `json:"released"` Color bool `json:"color,omitempty"` Actors []string } var movies = []Movie{ {Title: "Casablanca", Year: 1942, Color: false, Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}}, {Title: "Cool Hand Luke", Year: 1967, Color: true, Actors: []string{"Paul Newman"}}, {Title: "Bullitt", Year: 1968, Color: true, Actors: []string{"Steve McQueen", "Jacqueline Bisset"}}, // ... }
這樣的數據結構特別適合JSON格式,并且在兩種之間相互轉換也很容易。將一個Go語言中類似movies的結構體slice轉為JSON的過程叫編組(marshaling)。編組通過調用json.Marshal函數完成:
data, err := json.Marshal(movies) if err != nil { log.Fatalf("JSON marshaling failed: %s", err) } fmt.Printf("%s\n", data)
Marshal函數返還一個編碼后的字節slice,包含很長的字符串,并且沒有空白縮進;我們將它折行以便于顯示:
[{"Title":"Casablanca","released":1942,"Actors":["Humphrey Bogart","Ingr id Bergman"]},{"Title":"Cool Hand Luke","released":1967,"color":true,"Ac tors":["Paul Newman"]},{"Title":"Bullitt","released":1968,"color":true," Actors":["Steve McQueen","Jacqueline Bisset"]}]
其中Year名字的成員在編碼后變成了released,還有Color成員編碼后變成了小寫字母開頭的color。這是因為構體成員Tag所導致的。一個構體成員Tag是和在編譯階段關聯到該成員的元信息字符串:
Year int `json:"released"` Color bool `json:"color,omitempty"`
結構體的成員Tag可以是任意的字符串面值,但是通常是一系列用空格分隔的key:"value"鍵值對序列;因為值中含義雙引號字符,因此成員Tag一般用原生字符串面值的形式書寫。
關于golang的結構體就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。