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 生成对应的数据表struct定义操作
Apr 28 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
golang中的并发和并行
May 08 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang 实现WebSockets
Apr 24 Golang
Go gorilla/sessions库安装使用
Aug 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
PHP学习之PHP运算符
2006/10/09 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
PHP chop()函数讲解
2019/02/11 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
jquery easyui使用心得
2014/07/07 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
实例分析编写vue组件方法
2019/02/12 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
Python之re操作方法(详解)
2017/06/14 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
党校学习自我鉴定
2014/02/24 职场文书
房屋出租协议书
2014/04/10 职场文书
安全教育演讲稿
2014/05/09 职场文书
银行授权委托书范本
2014/10/04 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL
Python中requests库的用法详解
2022/06/05 Python