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语言中的UTF-8实现
Apr 26 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
golang elasticsearch Client的使用详解
May 05 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Golang jwt身份认证
Apr 20 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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
基于文本的访客签到簿
2006/10/09 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
PHP内置加密函数详解
2016/11/20 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
javascript操作元素的常见方法小结
2019/11/13 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python实现建立SSH连接的方法
2015/06/03 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
python计算二维矩形IOU实例
2020/01/18 Python
高中军训第一天感言
2014/03/06 职场文书
总结表彰大会主持词
2014/03/26 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
模具专业自荐信
2014/05/29 职场文书
村官个人总结范文
2015/03/03 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
小学数学国培研修日志
2015/11/13 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android