go结构体嵌套的切片数组操作
作者:wake_alone 发布时间:2024-02-09 12:38:57
看代码吧~
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的先后顺序是按照字母或者数字排列的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/m0_37561165/article/details/80481979


猜你喜欢
- 第一种方法: 分为 大 中 小 控制正文字体大小,一般需要指定 id<!DOCTYPE html PUBLIC "-//W3
- 本文实例讲述了python读写ini配置文件方法。分享给大家供大家参考。具体实现方法如下:import ConfigParserimport
- 如果你只使用一个更新日志,你只须清空日志文件,然后移走旧的更新日志文件到一个备份中,然后启用新的更新日志。用下列方法可以强制服务器启用新的更
- 1、过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大。正好看到graphics.
- 一. 使用logging模块时用python写代码时,logging模块最基本的几行配置,如下:import logginglogging.
- 掌握一些技巧,可尽量提高Python程序性能,也可以避免不必要的资源浪费。1、使用局部变量尽量使用局部变量代替全局变量:便于维护,提高性能并
- 在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854;
- 目录普通分页查询如何优化偏移量大采用id限定方式优化数据量大问题普通分页查询当我们在日常工作中遇到大数据查询的时候,第一反应就是使用分页查询
- SQL2008清空删除日志:方法一:USE [master]GOALTER DATABASE AFMS SET RECOVERY SIMPL
- 简单的说,在vue中我们使用模板HTML语法组建页面的,使用render函数我们可以用js语言来构建DOM因为vue是虚拟DOM,所以在拿到
- 本文实例讲述了Python内存管理。分享给大家供大家参考,具体如下:a = 1a是引用,1是对象。Python缓存整数和短字符串,对象只有一
- 简介Appium 是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语
- XML虽然比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML。DOM vs SAX操作XML
- 在matplotlib下,一个Figure对象可以包含多个子图(Axes),可以使用subplot()快速绘制,其调用形式如下:subplo
- Django版本为:2.1.7Python的web框架,MTV思想MVCModel(模板文件,数据库操作) view(视图模板文
- 概述本文主要介绍一种降维方法,PCA(Principal Component Analysis,主成分分析)。降维致力于解决三类问题。1.
- 在读取文件时候比如读取 xxx.csv 时候 可能报编码错误类似于'xxx' codec can't decode
- 前言TensorFlow目前在移动端是无法training的,只能跑已经训练好的模型,但一般的保存方式只有单一保存参数或者graph的,如何
- scratch-blocks编译的时候会出现的问题:scratch-gui依赖的scratch-blocks模块在安装的时候编译会报错。原因
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&