go结构体嵌套的切片数组操作


Posted in Golang onApril 28, 2021

看代码吧~

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

注意:

输出的结果运行多次不会改变顺序。

但是key的先后顺序是按照字母或者数字排列的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
Go各时间字符串使用解析
Apr 02 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Go语言测试库testify使用学习
Jul 23 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
golang json数组拼接的实例
Apr 28 #Golang
golang 实现对Map进行键值自定义排序
Apr 28 #Golang
go语言中json数据的读取和写出操作
Apr 28 #Golang
golang 实现菜单树的生成方式
Apr 28 #Golang
golang通过递归遍历生成树状结构的操作
Apr 28 #Golang
goland 恢复已更改文件的操作
goland 清除所有的默认设置操作
You might like
8个必备的PHP功能开发
2015/10/02 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
对Django外键关系的描述
2019/07/26 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
数字天堂软件测试面试题
2012/12/23 面试题
实习生求职自荐信
2014/02/07 职场文书
品牌转让协议书
2014/08/20 职场文书
体检通知范文
2015/04/21 职场文书
工会经费申请报告
2015/05/15 职场文书
《植树问题》教学反思
2016/03/03 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
Python学习之异常中的finally使用详解
2022/03/16 Python