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 21 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang slice元素去重操作
Apr 30 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
go 实现简易端口扫描的示例
May 22 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
Go语言入门exec的基本使用
May 20 Golang
Go调用Rust方法及外部函数接口前置
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
PHP语法速查表
2007/01/02 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
摘自启点的main.js
2008/04/20 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
js实现简单计算器
2015/11/22 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python中splitlines()方法的使用简介
2015/05/20 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
户籍证明的格式
2014/01/13 职场文书
领导检查欢迎词
2014/01/14 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
三方协议书范本
2014/04/22 职场文书
公路绿化方案
2014/05/12 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
单位委托书
2014/10/15 职场文书
工会工作个人总结
2015/03/03 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
力克胡哲观后感
2015/06/10 职场文书
新入职员工工作总结
2015/10/15 职场文书
高一语文教学反思
2016/02/16 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers