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 interface判断为空nil的实现代码
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Go语言grpc和protobuf
Apr 13 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
在ubuntu下安装go开发环境的全过程
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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php a simple smtp class
2007/11/26 PHP
php5中类的学习
2008/03/28 PHP
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
python3 判断列表是一个空列表的方法
2018/05/04 Python
浅析python参数的知识点
2018/12/10 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
写自荐信要注意什么
2013/12/26 职场文书
行政专员岗位职责
2014/01/02 职场文书
工程承包协议书
2014/04/22 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
表扬信格式模板
2015/05/05 职场文书
罗马假日观后感
2015/06/08 职场文书
红高粱观后感
2015/06/10 职场文书
创业计划书之溜冰场
2019/10/25 职场文书