結構是不同類型的數據的集合,這些數據叫作結構的字段。Golang通過組合一個或多個類型(包括內置類型和用戶定義類型)來聲明和創建新的數據類型。結構中的每個數據字段聲明都必須是已知類型,這些類型可以是內置類型或其他用戶定義類型。
結構是Golang中創建用戶定義類型的唯一方法,結構是通過一組固定且唯一的字段來聲明。結構使得程序模塊化,並允許在系統範圍內創建和傳遞複雜的數據結構。結構常用於創建記錄集。
結構的聲明從關鍵字type開始,然後是新結構的名稱,最後是關鍵字struct,花括號內,指定了一系列具有名稱和類型的數據字段:
聲明具有三個不同數據類型的字段的結構類型,名字叫作rectangle。定義好新結構後,就可以使用它的字面量。
rectangle結構及其字段不會導出到其他包,因為標識符是以小寫字母開頭。在Golang中,如果名稱以大寫字母開頭,標識符可以導出到其他包,否則只能限制在所聲明它的包中訪問。
var關鍵字聲明結構變量rect,然後使用點表示法將值賦給結構字段。
創建結構rectangle的實例,使用結構字面量給它每個字段賦初始值:
使用關鍵字new創建結構實例
new創建的實例,返回的是實例的指針,也可以用點符號訪問它的字段:
使用取指符&創建結構實例
取指符同樣返回的是實例的指針:
創建有嵌套的結構類型
可以使用其他結構類型作為結構字段的類型,創建具有嵌套的結構。將一個結構嵌套到另一個結構中是創建更復雜結構的有效方法:
使用字段標籤
在定義結構時,可選擇地為每個字段添加標籤,標籤用生字符串表示,用反引號``包圍
標籤常用於與其它數據格式如json、xml等交互時作為目標格式的屬性使用,被正常的程序流所忽略
添加方法到結構中
使用方法接收器把方法添加到結構類型當中,方法接收器在定義函數時寫在關鍵字func和函數字之間,即聲明一個結構類型的變量,函數體內部就可以引用該結構實例:
函數定義了接收器之後,該函數成為接收器結構類型的方法,所有與接收器類型相同的結構實例都可以通過點符號調用該函數。
為結構字段分配默認值
使用構造函數可以實現自定義默認值的賦值方法。Info函數用於為一個結構實例的字段賦予默認值,因為要改變函數外部實例的值,所以接收器定義為指針。
這種構造函數只是一種技巧方法而不是Golang規定中的一部分。
查詢結構的類型
reflect包支持檢查結構的底層類型:
比較兩個結構
結構可以使用比較操作符進行比較:
按值和按指針複製結構類型
r2將與r1相同,它是r1的副本,而不是對它的引用。對r2所做的任何更改都不會應用於r1,反之亦然。r3和r1引用同一個實例,當r3被更新時,r1也會變化,因為r1和r3引用的是相同的內存空間。
閱讀更多 蘋果魚 的文章