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 相关文章推荐
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
Go语言操作数据库及其常规操作的示例代码
Apr 21 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
go类型转换及与C的类型转换方式
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go Plugins插件的实现方式
Aug 07 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
第四章 php数学运算
2011/12/30 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
python sys模块sys.path使用方法示例
2013/12/04 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python处理RSTP视频流过程解析
2020/01/11 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
详解python程序中的多任务
2020/09/16 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
《尊严》教学反思
2014/02/11 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
软件售后服务方案
2014/05/29 职场文书
实习协议书
2015/01/27 职场文书
大连导游词
2015/02/12 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
详解如何修改nginx的默认端口
2021/03/31 Servers
table不让td文字溢出操作方法
2022/12/24 HTML / CSS