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 相关文章推荐
golang 实现两个结构体复制字段
Apr 28 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
golang import自定义包方式
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
golang 比较浮点数的大小方式
May 02 Golang
使用golang编写一个并发工作队列
May 08 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
Go语言基础知识点介绍
Jul 04 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
golang定时器
Apr 14 Golang
Golang 链表的学习和使用
Apr 19 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
PHP实现采集程序原理和简单示例代码
2007/03/18 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python入门篇之列表和元组
2014/10/17 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
python实现加密的方式总结
2020/01/19 Python
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
德国自行车商店:Tretwerk
2019/06/21 全球购物
为什么要用EJB
2014/04/17 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
房产销售经理职责
2013/12/20 职场文书
软件项目实施计划书
2014/05/02 职场文书
说明书范文
2014/05/07 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
工作检讨书范文
2015/01/23 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
汉字听写大会观后感
2015/06/12 职场文书
学生会任命书范本
2015/09/21 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang