Go遍历struct,map,slice的实现


Posted in Golang onJune 13, 2021

遍历结构体

如何实现遍历结构体字段? 好吧,言归正传!举个例子:

demo1:

package main

import (
   "fmt"
   "reflect"
)

type Student struct {
   name string
   age  int
}

func main() {
   v := reflect.ValueOf(Student{"乔峰", 29})
   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())
      }
   }
}

再举给栗子:

package main

import (
   "fmt"
   "reflect"
)

type LanType struct {
   s1, s2, s3 string
}

var language interface{} = LanType{"Php", "Go", "Python3"}

func main() {
   value := reflect.ValueOf(language)
   for i := 0; i < value.NumField(); i++ {
      fmt.Printf("字段索引 %d: %v\n", i, value.Field(i))
   }
}

输出:

BASIC
字段索引 0: Php
字段索引 1: Go
字段索引 2: Python3

遍历切片

使用 for range遍历:

package main

import (
   "fmt"
)

func main() {
   language := []string{"Php", "Go", "Python3"}
   for k, val := range language {
      fmt.Printf("切片索引 %d is :%s\n", k, val)
   }
}

输出:

BASIC
切片索引 0 is :Php
切片索引 1 is :Go
切片索引 2 is :Python3

遍历Map

package main

import (
   "fmt"
)

func main() {
   language := make(map[string]string)
   language["1"] = "Php"
   language["2"] = "Go"
   language["3"] = "Python3"
   language["4"] = "C#"

   for key, val := range language {
      fmt.Printf("%v=>%v\n", key, val)
   }
}

输出:这里就不贴了,结果会随机输出,因为map遍历出来结果是无序的,顺序不好控制,也不利于业务逻辑;当业务依赖key次序时,那么我们就需要引入“sort”包来解决随机化问题:

比如这样:

package main

import (
   "fmt"
   "sort"
)

func main() {
   language := make(map[string]string)
   language["1"] = "Php"
   language["2"] = "Go"
   language["3"] = "Python3"
   language["4"] = "C#"

   sorted_keys := make([]string, 0)
   for k, _ := range language {
      sorted_keys = append(sorted_keys, k) // 提取键名
   }
   sort.Strings(sorted_keys) //

   for _, k := range sorted_keys {
      fmt.Printf("%v=>%v\n", k, language[k])
   }
}

输出:

BASIC
1=>Php
2=>Go
3=>Python3
4=>C#

这样输出的结果运行多次也不会改变顺序。

Golang json序列化(struct,int,map,slice)

package main

import (
    "encoding/json"
    "fmt"
)

//把结构体都改小写
type User struct {
    UserName string `json:"user_name"` //json的tag标记
    Nickname string `json:"nickname"`
    Age      int
    Birthday string
    Sex      string
    Email    string
    Phone    string
}

func testStruct() {
    user1 := &User{
        UserName: "超哥",
        Nickname: "大头哥",
        Age:      18,
        Birthday: "2008/8/8",
        Sex:      "男",
        Email:    "mahuateng@qq.com",
        Phone:    "110",
    }

    //开始json序列化
    data, err := json.Marshal(user1)
    if err != nil {
        fmt.Printf("json.marshal failed,err:", err)
        return
    }
    fmt.Printf("%s\n", string(data))
}

func testInt() {
    var a = 18
    //开始json序列化
    data, err := json.Marshal(a)
    if err != nil {
        fmt.Printf("json.marshal failed,err:", err)
        return
    }
    fmt.Printf("%s\n", string(data))

}

func testMap() {
    var m map[string]interface{}     //声明map
    m = make(map[string]interface{}) //必须初始化map分配内存
    m["username"] = "user1"
    m["age"] = 18
    m["sex"] = "man"
    fmt.Println(m)
    data, err := json.Marshal(m)
    if err != nil {
        fmt.Printf("json.marshal failed,err:", err)
        return
    }
    fmt.Printf("%s\n", string(data))

}

func testSlice() {
    //定义一个slice,元素是map
    var m map[string]interface{}
    var s []map[string]interface{}
    m = make(map[string]interface{})
    m["username"] = "user1"
    m["age"] = 18
    m["sex"] = "man"
    s = append(s, m)
    m = make(map[string]interface{})
    m["username"]="user2"
    m["age"]=188
    m["sex"]="male"
    s=append(s,m)
    data, err := json.Marshal(s)
    if err != nil {
        fmt.Printf("json.marshal failed,err:", err)
        return
    }
    fmt.Printf("%s\n", string(data))

}
func main() {
    testStruct() //结构体的序列化
    testInt()//序列化数值
    testMap()//序列化map
    testSlice()//序列化切片
}

到此这篇关于Go遍历struct,map,slice的实现的文章就介绍到这了,更多相关Go遍历struct,map,slice内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
golang正则之命名分组方式
Apr 25 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
golang switch语句的灵活写法介绍
May 06 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 Golang
go web 预防跨站脚本的实现方式
Jun 11 #Golang
Golang生成Excel文档的方法步骤
Go timer如何调度
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 #Golang
Golang中异常处理机制详解
Go语言实现Snowflake雪花算法
Jun 08 #Golang
go语言中http超时引发的事故解决
Jun 02 #Golang
You might like
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
php动态函数调用方法
2015/05/21 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Python中请不要再用re.compile了
2019/06/30 Python
最小二乘法及其python实现详解
2020/02/24 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
泰国网上购物:Shopee泰国
2018/09/14 全球购物
旅游管理本科生求职信
2013/10/14 职场文书
机关道德讲堂实施方案
2014/03/15 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
学籍证明模板
2014/11/21 职场文书
大学生村官个人总结
2015/02/15 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
2015年小学辅导员工作总结
2015/05/27 职场文书
暖春观后感
2015/06/08 职场文书
Spring实现内置监听器
2021/07/09 Java/Android