本文目錄一覽:
golang中級進階(二):結構體
目錄
一、結構體詳解
1. 結構體定義
2. 實例化結構體的7種方法
二、結構體方法
1. 結構體的方法定義
2. 結構體內自定義方法的引用
3. 任意類型添加方法
三、嵌套、繼承
1. 匿名結構體
2. 結構體中可以定義任意類型的欄位
3. 結構體嵌套結構體
4. 結構體嵌套匿名結構體
5. 結構體嵌套多個匿名結構體
6. 結構體繼承
四、結構體和JSON相互轉換
1. 結構體轉化成json
2. json轉化成結構體
3. 結構體標籤 tag
4. 嵌套結構體和json的序列化反序列化
Golang 中沒有「類」的概念,Golang 中的結構體和其他語言中的類有點相似。和其他面向對 象語言中的類相比,Golang 中的結構體具有更高的擴展性和靈活性。
Golang 中的基礎數據類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全 部或部分屬性時,這時候再用單一的基本數據類型就無法滿足需求了,Golang 提供了一種 自定義數據類型,可以封裝多個基本數據類型,這種數據類型叫結構體,英文名稱 struct。 也就是我們可以通過 struct 來定義自己的類型了。
使用 type 和 struct 關鍵字來定義結構體,具體代碼格式如下:
type 類型名 struct {
欄位名 欄位類型
欄位名 欄位類型 …
}
其中:
• 類型名:表示自定義結構體的名稱,在同一個包內不能重複。
• 欄位名:表示結構體欄位名。結構體中的欄位名必須唯一。
• 欄位類型:表示結構體欄位的具體類型。
在 go 語言中,沒有類的概念但是可以給類型(結構體,自定義類型)定義方法。所謂方法 就是定義了接收者的函數。接收者的概念就類似於其他語言中的 this 或者 self。
方法的定義格式如下:
func (接收者變數 接收者類型) 方法名(參數列表) (返回參數) {
函數體
}
注意:想改變結構體內的值,必須先變成指針。
在 Go 語言中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法。 舉個例子,我們基於內置的 int 類型使用 type 關鍵字可以定義新的自定義類型,然後為我們 的自定義類型添加方法。
注意:匿名結構體中不允許出現多個重複的類型
注意:如果結構體裡面有私有屬性也就是小寫定義的欄位,則不會被json使用
golang函數返回值是結構體值的時候,為何不能對成員賦值呢?
1,右值不可賦值
2,函數返回的是右值
getTest()是右值,結構體整體都是右值,右值不可賦值
getTestPoint()返回當然也是右值,但只有指針是右值,即你不能給返回的指針賦值(例如:getTestPoint() = nil),但是可以給指針指向的結構體成員賦值(就像你代碼里那樣)
有右值自然就有左值,左值是可被賦值的,例如
t := getTest() //getTest() 返回的右值,賦值給左值t
t.test = 1,左值可被賦值
golang 方法返回的結構體為什麼取不到地址?
golang方法(method)返回值提取結構體(struct)取不到地址的原因是,①返回值並沒有保存到變數中,返回值本身只是臨時保存在程序運行的堆棧的某個不確定位置,不能取地址;②實參取地址用的操作符是是,而形參聲明變數類型為指針,需要地址值用的才是*;③聲明形參為指針的參數的實參只能為地址值。
故先把修改後的代碼列出,修改要點是把「*NewPerson1().Speak()」改為「var b=NewPerson1();(b).Speak()」,同時把「NewPerson2().Speak()」改成「var a=NewPerson2();(a).Speak()」,代碼列出如下:
package main;
import “fmt”;
type PersonA struct{
name string
}
func (p *PersonA) Speak () {
fmt.Println ( “person speak” ,p.name)
}
func (p PersonA) Walk ( ){
fmt . Println ( “person walk”,p.name)}
func NewPerson1()(p PersonA){
return PersonA{“new Person1”}}
func NewPerson2()(p PersonA){
return PersonA{“new Person2”}}
func main () {
var a=NewPerson2 (); (a).Speak ();
a .Walk ();
fmt. Println (“——————–“) ;
var b=NewPerson1 ();(b).Speak ();
b.Walk ()}
go代碼調試效果
關於指針變數的使用這一點go語言和其他有指針的程序語言如c語言是一樣的,從來只有返回值為地址/指針,而從沒有在賦值前給返回值取地址這種運算,類似的錯誤晚點再整理。
不一樣的是,go語言更簡單go語言函數可以使用結構體或者結構體的指針(pointer)以傳遞結構體參數,而且和c語言不一樣的是,go語言沒有區分結構體指針和結構體訪問成員的運算符,go語言只有「.」適用於兩種情況,而沒有c語言為結構體指針專門準備的「-」運算符。
可以使用結構體指針,作為結構體的方法的參數以指代自身嗎,
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/304780.html