定義類型的別名
- 結構體是用戶單獨定義的類型,不能和其他Go內置類型進行強制轉換(如
int
,string
等) - 類型仍可透過
type
重新命名(別名),但是與原類型為不同類型1
2
3
4type 原類型 類型別名
type integer int
type stu Student
- 在定義struct的別名時,即使內部的字段(屬性)都相同,別名類型與原類型仍為不同類型
- 因此不同類型之間不能賦值也不能運算
- 若要是進行賦值及運算則必須強制轉換
工廠模式(構造函數)
構造函數:對象不需要參數即可調用的構造函數。對象生成時如果沒有顯式地調用構造函數,則預設構造函數會被自動調用。
可是在Golang中,並無構造函數存在因此需顯式的使用工廠模式調用自定義的構造函數
1 | package model |
struct中的tag
- tag 相當於struct中字段的原信息
- 我們可以為struct中的每個字段,在字段的類型後面寫上一個tag
- tag相當於這個字段的說明,編譯器會將tag儲存,並作為此字段的描述
- 這個tag可通過反射的機制獲取到
- 最常用的場景就是json的序列化與反序列化
- 通常json打包所使用的大部分都是小寫字母,但Go語言在包外要引用結構體內的字段需要首字大寫才能訪問,使用tag指定字段來調用struct
聲明tag
1 | type Student struct { |
json序列化與反序列化
1 | package main |
result
1 | {"name":"Tom","age":18} |
- 從結果可得知,我們所使用的json tag為小寫,透過外部的json package訪問到被打包的字段便是小寫的
- 亦剛好符合json大部分皆為小寫的需求
- 透過json key取得其對應的value
匿名字段
結構體中的可以包含字段是只有類型,沒有名字,即匿名字段
example
1 | //定義結構體 |
訪問
1 | package main |
result
1 | {{TzeChiang 30} {0 0 <nil>} 8757} |