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中切片copy复制和等号复制的区别介绍
Apr 27 Golang
golang中的空slice案例
Apr 27 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang import自定义包方式
Apr 29 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 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
如何给phpadmin一个保护
2006/10/09 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
九年级英语教学反思
2014/01/31 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
中班上学期个人总结
2015/02/12 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js