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中ResponseWriter的一个坑
Apr 27 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
基于Python实现西西成语接龙小助手
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
使用 php4 加速 web 传输
2006/10/09 PHP
php实现图片缩放功能类
2013/12/18 PHP
php验证码实现代码(3种)
2015/09/07 PHP
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
python opencv之分水岭算法示例
2018/02/24 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
python实现银行管理系统
2019/10/25 Python
python集合删除多种方法详解
2020/02/10 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
Python基于template实现字符串替换
2020/11/27 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
宿舍打麻将检讨书
2014/01/24 职场文书
2014年国培研修感言
2014/03/09 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
教师节学生演讲稿
2014/09/03 职场文书
校园广播稿100字
2014/10/06 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
雾霾停课通知
2015/04/24 职场文书
市级三好生竞选稿
2015/11/21 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
python​格式化字符串
2022/04/20 Python