您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Go Struct結構體如何實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Go Struct結構體如何實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Go語言中沒有“類”的概念,也不支持“類”的繼承等面向對象的概念。(繼承,多態,封裝)
Go語言中通過結構體的內嵌再配合接口比面向對象具有更高的擴展性和靈活性。
只有當結構體實例化時,才會真正地分配內存(其實也就是使用new),也就是必須實例化后才能使用結構體的字段。
結構體本身也是一種類型,我們可以像聲明內置類型一樣使用 var 關鍵字聲明結構體類型。
type person struct { name string city string age int } func main() { var p1 person p1.name = "張三" p1.city = "北京" p1.age = 18 fmt.Printf("p1=%v\n", p1) // p1={張三 北京 18} fmt.Printf("p1=%#v\n", p1) // p1=main.person{name:"張三", city:"北京", age:18} }
我們還可以通過使用 new 關鍵字對結構體進行實例化,得到的是結構體的地址
從打印的結果中我們可以看出 p2 是一個結構體指針。
注意:在 Golang 中支持對結構體指針直接使用.來訪問結構體的成員。
p2.name = "張三" 其實在底層是 (*p2).name = "張三"
type person struct { name string city string age int } func main() { var p2 = new(person) p2.name = "張三" p2.age = 20 p2.city = "北京" fmt.Printf("p2=%#v \n", p2) //p2=&main.person{name:"張三", city:"北京", age:20} }
type person struct { name string city string age int } func main() { p4 := &person{ name: "zhangsan", city: "北京", age: 18, } // p4=&main.person{name:"zhangsan", city:"北京", age:18} fmt.Printf("p4=%#v\n", p4) }
1. 結構體說明
在 go 語言中,沒有類的概念但是可以給類型(結構體,自定義類型)定義方法。所謂方法就是定義了接收者的函數。
Go語言中的方法(Method)是一種作用于特定類型變量的函數。這種特定類型變量叫做接收者(Receiver)。接收者的概念就類似于其他語言中的this或者 self。
方法的定義格式如下:
func (接收者變量 接收者類型) 方法名(參數列表) (返回值) { 函數體 }
2. 結構體方法和接收者
給結構體 Person 定義一個方法打印 Person 的信息
type Person struct { name string age int8 } func (p Person) printInfo() { fmt.Printf("姓名:%v 年齡:%v", p.name, p.age) // 姓名:小王子 年齡:25 } func main() { p1 := Person{ name: "小王子", age: 25, } p1.printInfo() // 姓名:小王子 年齡:25 }
3. 值類型和指針類型接收者
實例1:給結構體 Person 定義一個方法打印 Person 的信息
值類型的接收者
當方法作用于值類型接收者時,Go 語言會在代碼運行時將接收者的值復制一份。
在值類型接收者的方法中可以獲取接收者的成員值,但 修改操作只是針對副本 ,無法修改接收者變量本身。
指針類型的接收者
指針類型的接收者由一個結構體的指針組成
由于指針的特性,調用方法時修改接收者指針的任意成員變量,在方法結束后,修改都是有效的。
這種方式就十分接近于其他語言中面向對象中的 this 或者 self
方法大部分時候是自己處理自己的數據,總結如下:
比如我們 Golang 要給 App 或者小程序提供 Api 接口數據,這個時候就需要涉及到結構體和Json 之間的相互轉換。
GolangJSON 序列化是指把結構體數據轉化成 JSON 格式的字符串
Golang JSON 的反序列化是指把 JSON 數據轉化成 Golang 中的結構體對象
Golang 中 的 序 列 化 和 反 序 列 化 主 要 通 過 "encoding/json" 包 中 的 json.Marshal() 和json.Unmarshal()方法實現
struct轉Json字符串
type Student struct { ID int Gender string name string //私有屬性不能被 json 包訪問 Sno string } func main() { var s1 = Student{ ID: 1, Gender: "男", name: "李四", Sno: "s0001", } fmt.Printf("%#v\n", s1) // main.Student{ID:1, Gender:"男", name:"李 四",Sno:"s0001"} var s, _ = json.Marshal(s1) jsonStr := string(s) fmt.Println(jsonStr) // {"ID":1,"Gender":"男","Sno":"s0001"} }
Json字符串轉struct
type Student struct { ID int Gender string Name string Sno string } func main() { var jsonStr = `{"ID":1,"Gender":"男","Name":"李四","Sno":"s0001"}` var student Student //定義一個 Monster 實例 err := json.Unmarshal([]byte(jsonStr), &student) if err != nil { fmt.Printf("unmarshal err=%v\n", err) } // 反序列化后 student=main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"} student.Name="張三" fmt.Printf("反序列化后 student=%#v student.Name=%v \n", student, student.Name) }
1)Tag標簽說明
Tag 是結構體的元信息,可以在運行的時候通過反射的機制讀取出來。
Tag 在結構體字段的后方定義,由一對反引號包裹起來
具體的格式如下:
key1:"value1" key2:"value2"
結構體 tag 由一個或多個鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。
同一個結構體字段可以設置多個鍵值對 tag,不同的鍵值對之間使用空格分隔。
注意事項:
為結構體編寫 Tag 時,必須嚴格遵守鍵值對的規則。
結構體標簽的解析代碼的容錯能力很差,一旦格式寫錯,編譯和運行時都不會提示任何錯誤,通過反射也無法正確取值。例如不要在 key 和 value 之間添加空格。
Tag結構體轉化Json字符串
type Student struct { ID int `json:"id"` //通過指定 tag 實現 json 序列化該字段時的 key(表示在做json操作的時候,用json指定的字段名) Gender string `json:"gender"` Name string Sno string } func main() { var s1 = Student{ ID: 1, Gender: "男", Name: "李四", Sno: "s0001", } // main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"} fmt.Printf("%#v\n", s1) var s, _ = json.Marshal(s1) jsonStr := string(s) fmt.Println(jsonStr) // {"id":1,"gender":"男","Name":"李四","Sno":"s0001"} }
Json字符串轉成Tag結構體
type Student struct { ID int `json:"id"` //通過指定 tag 實現 json 序列化該字段時的 key Gender string `json:"gender"` Name string Sno string } func main() { var s2 Student var str = `{"id":1,"gender":"男","Name":"李四","Sno":"s0001"}` err := json.Unmarshal([]byte(str), &s2) if err != nil { fmt.Println(err) } // main.Student{ID:1, Gender:"男", Name:"李四", Sno:"s0001"} fmt.Printf("%#v", s2) }
讀到這里,這篇“Go Struct結構體如何實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。