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字符串就標准了。
關注公眾號,隨時獲取最新資訊
細節決定成敗!
個人愚見,如有不對,懇請斧正!