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
golang goroutine顺序输出方式
Apr 29 Golang
golang日志包logger的用法详解
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
golang为什么要统一错误处理
Apr 03 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
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
239军机修复记
2021/03/02 无线电
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
Python闭包实现计数器的方法
2015/05/05 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
python字典的常用方法总结
2019/07/31 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
经典优秀个人求职信分享
2013/12/12 职场文书
校友会欢迎辞
2014/01/13 职场文书
便利店投资创业计划书
2014/02/08 职场文书
《乌塔》教学反思
2014/02/17 职场文书
教师考核表个人总结
2015/02/12 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers