Golang | 結構體的定義和使用
阿新 • • 發佈:2022-03-29
Struct
struct(結構體)就是使用者自己定義的型別,一個結構體對應現實中的一個型別,和Java中的Class類相似,但是沒有Class類那麼複雜,沒有多型,繼承,封裝。只保留了最基礎的特性:組合。組合也只是形成最基本的複合型別。
初始化
自定義一個User型別,並且對這個User型別進行初始化。
type User struct { Id int Name string age int } func initStruct() { u1 := new(User) // 使用內建函式進行初始化 u2 := User{} // 直接初始化 u3 := &User{1,"張三",10} // 所有欄位順序初始化 不顯示指定欄位初始化的話,必須按順序對所有欄位進行賦值 u4 := &User{Id: 1,age: 10} // 指定欄位初始化 fmt.Println(u1) // &{0 0} fmt.Println(u2) // {0 0} fmt.Println(u3) // &{1 張三 10} fmt.Println(u4) // &{1 10} }
型別初始化之後,如果結構體中的欄位沒有被賦值,就會被初始化該型別的零值。
我們在實際使用中,通常不使用以上的方式進行初始化結構體,一般使用一個建構函式來進行初始化:
func NewUser(id int,name string) *User {
return &User{Id: id,Name: name}
}
fmt.Println(NewUser(2,"張三")) // &{2 張三 0}
自定義的構體函式一般使用 New
開頭,以結構體名稱結尾,初始化時,使用幾個引數傳入幾個引數,並且返回
可見性
結構體的可見性和包內變數是相同的,結構體名稱為首字母為大寫開頭,別的包可以引用,欄位的話,首字母為小寫只能包內可見,首字母大寫的話, 別的包也可見。
函名組合
type User struct { Info Id int Name string age int } type Info struct { Introduction string Name string } // 結構體組合 func combination() { user := &User{Info{"組合類","李四"},1, "張三", 10} fmt.Println(user.Name) // 組合中的同名欄位,不指定的話,取外部結構體的欄位 fmt.Println(user.Info.Name) // 組合中的同欄位,如果想取內部結構體的欄位,必須要指定內部結構體的名稱進行取值 fmt.Println(user.Introduction) // 如果內部組合中欄位名和外部沒有重複,可以直接取這個欄位輸出 }
有介面的情況下,外部的結構體可以使用內部結構體的方法
如果這個結構體只使用一次,可以使用以下方法進行結構體的構造:
type User struct {
Info
TInfo struct{
Name string
}
Id int
Name string
age int
}
帶標籤的結構休
我們在網路傳輸中,需要把一個結構體轉換為一個JSON字串進行傳輸,我們看一下,不加標籤的結構體轉換為JSON字串後的情況:
user := &User{Id: 1, age: 10} // 指定欄位初始化
fmt.Println(user) // &{1 10}
jsonUser, _ := json.Marshal(user)
fmt.Println(string(jsonUser)) // {"Introduction":"","Id":1,"Name":""}
這樣也可以轉為JSON字串,但是不符合我們在不同應用中傳遞的規範,在Go中欄位名首字母為在寫,轉換後也是按照結構體的欄位進行輸出的。
如果我們想要符合規範,首字母小寫,並且兩個單詞之間使用 _
連線,我們可以使用標籤對結構體進行修改:
type User struct {
Info `json:"info"`
Id int `json:"id"`
Name string `json:"name"`
age int `json:"age"`
}
type Info struct {
Introduction string `json:"introduction"`
Name string `json:"name"`
}
{"info":{"introduction":"","name":""},"id":1,"name":""}
對結構體新增標籤後,我們輸出的JSON字串就標準了。
關注公眾號,隨時獲取最新資訊
細節決定成敗!
個人愚見,如有不對,懇請斧正!