中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在golang中利用結構體嵌套的切片數組

發布時間:2021-04-29 16:13:43 來源:億速云 閱讀:1381 作者:Leah 欄目:開發技術

本篇文章為大家展示了怎么在golang中利用結構體嵌套的切片數組,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

什么是golang

golang 是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能。

package main
import (
 "fmt"
)
type XCDataStu struct {
 Id   int    `json:"id"   xorm:"id"`
 Name string `json:"name"  xorm:"name"`
}
type XCDataStu1 struct {
 Id             int    `json:"id" xorm:"id"`
 Str1           string `json:"str1" xorm:"str1"`
 Db1            string `json:"db1" xorm:"db1"`
 Device_type    string `json:"Device_type" xorm:"Device_type"`
 DeviceTypeName string `json:"DeviceTypeName"`
}
type XCDataStuAll struct {//結構體嵌套
 XCDataStuinall  XCDataStu
 XCDataStu1inall XCDataStu1
}
func main() {
/*1*/
 xcData := []XCDataStu{
  XCDataStu{Id: 758, Name: "David758"},
  XCDataStu{Id: 759, Name: "David759"},
 }
/*2*/
 xcdataall := make([]XCDataStuAll, len(xcData))
 /*xcdataall[0]={ XCDataStu{Id: 758, Name: "David758"},
 XCDataStu1{Id: 0, Str1: "dsa", Db1: "dsa",
  Device_type: "fhls", DeviceTypeName: "dasf"}}*/
 fmt.Println(len(xcData))
 fmt.Println(xcData[0])
 fmt.Println(xcData[1])
 i := 0
 for ; i < 2; i++ {
  xcdataall[i].XCDataStuinall.Id = xcData[i].Id
  xcdataall[i].XCDataStuinall.Name = xcData[i].Name
 }
 fmt.Println(xcdataall)
}

結構體切片:

可以直接聲明時初始化,如程序中的1

可以用make,但是必須給定長度,否則不能使用下標進行賦值。

如程序中的2

 var xcdataall []XCDataStuAll
 for ; i < 2; i++ {
  xcdataall[i].XCDataStuinall.Id = xcData[i].Id
  xcdataall[i].XCDataStuinall.Name = xcData[i].Name
 }

程序編譯沒錯,但是最后運行后會出現panic。。。

panic: runtime error: index out of range

補充:go遍歷結構體(struct)字段對應的值,切片(slice),字典(map)

一、遍歷結構體字段:

eg1:

package main
import (
    "fmt"
    "reflect"
)
type person struct {
    name string
    age  int
}
func main() {
    v := reflect.ValueOf(person{"steve", 30})
    count := v.NumField()
    for i := 0; i < count; i++ {
        f := v.Field(i)
        switch f.Kind() {
        case reflect.String:
            fmt.Println(f.String())
        case reflect.Int:
            fmt.Println(f.Int())
        }
    }
}

輸出結果:

steve

30

eg2:

package main
import (
    "fmt"
    "reflect"
)
type NotknownType struct {
    s1, s2, s3 string
}
var secret interface{} = NotknownType{"Ada", "Go", "Oberon"}
func main() {
    value := reflect.ValueOf(secret)
    for i := 0; i < value.NumField(); i++ {
        fmt.Printf("Field %d: %v\n", i, value.Field(i))
    }
}

輸出結果:

Field 0: Ada

Field 1: Go

Field 2: Oberon

二、遍歷切片:

for range 結構

package main
import (
    "fmt"
)
func main(){
    slice := []string{"hello","world","hello","everyone!"}
    for k,val:=range slice{
        fmt.Printf("slice %d is :%s\n",k,val )
    }
}

輸出結果:

slice 0 is :hello

slice 1 is :world

slice 2 is :hello

slice 3 is :everyone!

三、遍歷map:

package main
import (
    "fmt"
)
func main() {
    m := make(map[string]string)
    m["1"] = "hello"
    m["2"] = "world"
    m["3"] = "go"
    m["4"] = "is"
    m["5"] = "cool"
    fmt.Printf("The corresponding relationship between key and value is:\n")
    for key, val := range m {
        fmt.Printf("%v===>%v\n", key, val)
    }
}

輸出結果:

The corresponding relationship between key and value is:

1===>hello

2===>world

3===>go

4===>is

5===>cool

但是還有一個問題,上面的程序不做改動運行第二次,結果順序就會改變,因為map遍歷出來結果是無序的,這不好控制,也不利于業務邏輯;當業務依賴key次序時,需要引入“sort”包來解決隨機化問題

代碼如下:

package main
import (
    "fmt"
    "sort"
)
func main() {
    m := make(map[string]string)
    m["1"] = "hello"
    m["2"] = "world"
    m["3"] = "go"
    m["4"] = "is"
    m["5"] = "cool"
    sorted_keys := make([]string, 0)
    for k, _ := range m {
        sorted_keys = append(sorted_keys, k)
    }
    sort.Strings(sorted_keys)
    for _, k := range sorted_keys {
        fmt.Printf("%v=====>%v\n", k, m[k])
    }
}

輸出結果是:

1=====>hello

2=====>world

3=====>go

4=====>is

5=====>cool

上述內容就是怎么在golang中利用結構體嵌套的切片數組,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

慈溪市| 抚州市| 肇庆市| 苏尼特右旗| 休宁县| 平昌县| 金乡县| 礼泉县| 延边| 册亨县| 广南县| 绩溪县| 驻马店市| 阿鲁科尔沁旗| 怀来县| 禄丰县| 鄄城县| 辽宁省| 宁德市| 梅河口市| 同德县| 怀仁县| 临武县| 灵山县| 达日县| 大城县| 黄陵县| 咸阳市| 荔波县| 婺源县| 清流县| 交口县| 万山特区| 九龙坡区| 荣成市| 龙泉市| 凤山市| 汝城县| 鹿泉市| 内黄县| 山东省|