go語言 結構體陣列定義_Go 語言使用者定義的型別
技術標籤:go語言 結構體陣列定義
Go 語言允許使用者自定義型別。
當用戶宣告一個新型別時,這個宣告就給編譯器提供了一個框架,告知必要的記憶體大小和表示資訊。
聲明後的型別和內建型別的運作方式類似。
Go 語言裡宣告使用者自定義型別有兩種方法:
struct 關鍵字
使用 struct 關鍵字是最常用的方法,它可以讓使用者建立一個結構體型別。
1、宣告一個結構體型別
typeUserstruct{
Namestring
Ageint64
Emailstring
Scoreint64
}
結構體型別的宣告以關鍵字 type 開始,之後是新型別的名字,最後是關鍵字 struct。
這個結構體型別有 4 個欄位,每個欄位都是基於一個內建型別。
一旦聲明瞭型別,就可以使用這個型別建立值。
2、使用自定義結構體型別宣告變數,並初始化其為零值
//宣告User型別的變數
varuserUser
- 關鍵字 var 建立了型別為 User 且名為 user 的變數。當宣告變數時,這個變數對應的值總是會被初始化。
- 這個值要麼用指定的值初始化,要麼用零值(即變數型別的預設值)做初始化。對數值型別來說,零值是 0;對字串來說,零值是空字串;對 布林型別,零值是 false.
任何時候,建立一個變數並初始化其為零值,習慣使用關鍵字 var。這種用法是為了更明確地表示一個變數被設定為零值。
如果變數被初始化為某個非零值,就配合結構體字面量和短變數宣告操作符來建立變數,如下所示。
typeUserstruct{
Namestring
Ageint64
Emailstring
Scoreint64
}
funcmain(){
//宣告User型別的變數,並初始化所有欄位
oscar:=User{
Name:"Oscar",
Age:20,
Email:"[email protected]",
Score:90,
}
}
如何宣告一個 User 型別的變數,並使用某個非零值作為初始值?
首先定義一個變數名(oscar),之後是短變數宣告操作符。這個操作符是冒號加一個等號(:=)。
一個短變數宣告操作符在一次操作中完成兩件事:宣告一個變數,並初始化。
短變數操作符會使用右側給出的型別資訊作為宣告變數的型別。
既然要建立並初始化一個數據型別,就要使用結構體字面量來完成這個初始化。結構體字面量使用一對大括號括住內部欄位的初始值。
結構體字面量可以對結構體型別採用兩種形式:
1、使用結構體字面量建立結構體型別的值
User{
Name:"Oscar",
Age:20,
Email:"[email protected]",
Score:90,
}
- 這種形式對欄位的宣告順序沒有要求。
2、不使用欄位名建立結構體型別的值
lisa:=User{"Oscar",22,"[email protected]",88}
- 這種形式值的順序很重要,必須要和結構體中宣告的欄位順序一致。
當宣告結構體型別時,欄位型別並僅限於內建型別,也可以使用其他使用者定義的型別。
//宣告Admin型別的變數
admin:=Admin{
//User型別的欄位
person:User{
Name:"Oscar",
Age:18,
Email:"[email protected]",
Score:70,
},
level:"super",
}
另外一種宣告使用者定義的型別的方法是基於一個已有的型別,將其作為新型別的型別說明。當需要一個可以用已有型別表示的新型別的時候,這種方法會非常好用。
- 基於 int64 宣告一個新型別
typeDurationint64
這是標準庫 time 包裡的一個型別宣告。Duration 是一種描述時間間隔的型別,單位是納秒(ns)。這個型別使用內建的 int64 型別作為其代表。在 Duration 型別宣告中,把 int64 型別叫做 Duration 的基礎型別,雖然 int64 是基礎型別,Go 並不認為 Duration 和 int64 是同一種類型,Duration 型別依然是一個獨立的型別,兩種不同型別的值即便相互相容,也不能相互賦值,編譯器不會對不同型別的值做隱式轉換。