<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                >[info] 結構體 Go語言中的基礎數據類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全部或部分屬性 時,這時候再用單一的基本數據類型明顯就無法滿足需求了,Go語言提供了一種自定義數據類型,可以 封裝多個基本數據類型,這種數據類型叫結構體,英文名稱struct。 也就是我們可以通過struct來定義自己的類型了。 ``` 結構體字段的可見性: 結構體中字段大寫開頭表示可公開訪問,小寫表示私有(僅在定義當前結構體的包中可訪問)。 ``` ## 1. 結構體的定義 使用 `type` 和 `struct` 關鍵字來定義結構體,具體代碼格式如下: ~~~ type 類型名 struct { 字段名 字段類型 字段名 字段類型 … } ~~~ 其中: ~~~ 1. 類型名:標識自定義結構體的名稱,在同一個包內不能重復。 2. 字段名:表示結構體字段名。結構體中的字段名必須唯一。 3. 字段類型:表示結構體字段的具體類型。 ~~~ * **示例:** ~~~ // 我們定義一個Person(人)結構體 type person struct { name string city string address, idCard string age int8 } ~~~ ## 2. 結構體實例化 只有當結構體實例化時,才會真正地分配內存。也就是必須實例化后才能使用結構體的字段。 結構體本身也是一種類型,我們可以像聲明內置類型一樣使用var關鍵字聲明結構體類型。 ``` var 結構體實例 結構體類型 ``` ## 3. 基本實例化 * **示例:** ~~~ package main import ( "fmt" ) type person struct { name string city string age int8 } func main() { // 結構體初始化 var p1 person p1.name = "pprof.cn" p1.city = "北京" p1.age = 18 fmt.Printf("p1=%v\n", p1) //p1={pprof.cn 北京 18} fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"pprof.cn", city:"北京", age:18} // 使用鍵值對初始化 p5 := person{ name: "pprof.cn", city: "北京", age: 18, } fmt.Printf("p5=%#v\n", p5)// p5=main.person{name:"pprof.cn", city:"北京", age:18} // 也可以對結構體指針進行鍵值對初始化 p6 := &person{ name: "pprof.cn", city: "北京", age: 18, } fmt.Printf("p6=%T\n", p6) // p6=*main.person fmt.Printf("p6=%#v\n", p6) // p6=&main.person{name:"pprof.cn", city:"北京", age:18} } ~~~ ## 4. 匿名結構體 在定義一些臨時數據結構等場景下還可以使用匿名結構體。 * **示例:** ~~~ package main import ( "fmt" ) func main() { var user struct { Name string Age int } user.Name = "pprof.cn" user.Age = 18 fmt.Printf("%#v\n", user)// struct { Name string; Age int }{Name:"pprof.cn", Age:18} } ~~~ ## 5. 創建指針類型結構體 我們還可以通過使用new關鍵字對結構體進行實例化,得到的是結構體的地址。 格式如下: * **示例:** ~~~ package main import ( "fmt" ) type person struct { name string city string age int8 } func main() { var p2 = new(person) fmt.Printf("%T\n", p2) // *main.person fmt.Printf("p2=%#v\n", p2) // p2=&main.person{name:"", city:"", age:0} } ~~~ ## 6. 取結構體的地址實例化 使用 `&` 對結構體進行取地址操作相當于對該結構體類型進行了一次 `new` 實例化操作。 * **示例:** ~~~ package main import ( "fmt" ) type person struct { name string city string age int8 } func main() { p3 := &person{} fmt.Printf("%T\n", p3) // *main.person fmt.Printf("p3=%#v\n", p3) // p3=&main.person{name:"", city:"", age:0} p3.name = "博客" p3.age = 30 p3.city = "成都" fmt.Printf("p3=%#v\n", p3) // p3=&main.person{name:"博客", city:"成都", age:30} } ~~~ ## 7. 嵌套結構體 * **示例:** ~~~ package main import ( "fmt" ) // Address 地址結構體 type Address struct { Province string City string } // User 用戶結構體 type User struct { Name string Gender string Address Address } func main() { user1 := User{ Name: "pprof", Gender: "女", Address: Address{ Province: "黑龍江", City: "哈爾濱", }, } fmt.Printf("user1=%#v\n", user1)// user1=main.User{Name:"pprof", Gender:"女", Address:main.Address{Province:"黑龍江", City:"哈爾濱"}} } ~~~ ## 8. 結構體與JSON序列化 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。易于人閱讀和編寫。同時 也易于機器解析和生成。JSON鍵值對是用來保存JS對象的一種方式,鍵/值對組合中的鍵名寫在前面并 用雙引號""包裹,使用冒號:分隔,然后緊接著值;多個鍵值之間使用英文,分隔。 * **示例:** ~~~ package main import ( "encoding/json" "fmt" ) // Student 學生 type Student struct { ID int Gender string Name string } // Class 班級 type Class struct { Title string Students []*Student } func main() { c := &Class{ Title: "101", Students: make([]*Student, 0, 200), } for i := 0; i < 10; i++ { stu := &Student{ // 2位數字(補充0) Name: fmt.Sprintf("stu_%02d", i), Gender: "男", ID: i, } c.Students = append(c.Students, stu) } // JSON序列化:結構體-->JSON格式的字符串 data, err := json.Marshal(c) if err != nil { fmt.Println("json marshal failed") return } fmt.Printf("json:%s\n", data) // JSON反序列化:JSON格式的字符串-->結構體 str := `{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"}, {"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"}, {"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"}, {"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"}, {"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"}, {"ID":9,"Gender":"男","Name":"stu09"}]}` c1 := &Class{} err = json.Unmarshal([]byte(str), c1) fmt.Printf("struct:%v\n", c1.Title) } ~~~ * **結果:** ``` json:{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu_00"},{"ID":1,"Gender":"男","Name":"stu_01"},{"ID":2,"Gender":"男","Name":"stu_02"},{"ID":3,"Gender":"男","Name":"st"},{"ID":4,"Gender":"男","Name":"stu_04"},{"ID":5,"Gender":"男","Name":"stu_05"},{"ID":6,"Gender":"男","Name":"stu_06"},{"ID":7,"Gender":"男","Name":"stu_07"},{"ID":8,"Gender":"男",":"stu_08"},{"ID":9,"Gender":"男","Name":"stu_09"}]} struct:101 ``` ## 9. 結構體標簽(Tag) Tag是結構體的元信息,可以在運行的時候通過反射的機制讀取出來。 Tag在結構體字段的后方定義,由一對反引號包裹起來,具體的格式如下: ``` `key1:"value1" key2:"value2"` ``` 結構體標簽由一個或多個鍵值對組成。鍵與值使用冒號分隔,值用雙引號括起來。鍵值對之間使用一個 空格分隔。 注意事項: 為結構體編寫Tag時,必須嚴格遵守鍵值對的規則。結構體標簽的解析代碼的 容錯能力很差,一旦格式寫錯,編譯和運行時都不會提示任何錯誤,通過反射也無法正確取值。例如不 要在 key 和 value 之間添加空格。 * **示例:** ~~~ package main import ( "encoding/json" "fmt" ) //Student 學生 type Student struct { ID int `json:"id"` //通過指定tag實現json序列化該字段時的key Gender string //json序列化是默認使用字段名作為key name string //私有不能被json包訪問 } func main() { s1 := Student{ ID: 1, Gender: "女", name: "pprof", } data, err := json.Marshal(s1) if err != nil { fmt.Println("json marshal failed!") return } fmt.Printf("json str:%s\n", data) // json str:{"id":1,"Gender":"女"} } ~~~ ## 10. 刪除map類型的結構體 * **示例:** ~~~ package main import ( "fmt" ) // Student 學生 type student struct { id int name string age int } func main() { ce := make(map[int]student) ce[1] = student{1, "xiaolizi", 22} ce[2] = student{2, "wang", 23} fmt.Println(ce) delete(ce, 2) fmt.Println(ce) } ~~~ * **結果:** ``` map[1:{1 xiaolizi 22} 2:{2 wang 23}] map[1:{1 xiaolizi 22}] ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看