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
Go语言带缓冲的通道实现
Apr 26 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
golang slice元素去重操作
Apr 30 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
Go标准容器之Ring的使用说明
May 05 Golang
使用golang编写一个并发工作队列
May 08 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 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
3
2006/10/09 PHP
php遍历数组的方法分享
2012/03/22 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
python 运算符 供重载参考
2009/06/11 Python
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
TensorFlow的权值更新方法
2018/06/14 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
什么是python的函数体
2020/06/19 Python
详解python的super()的作用和原理
2020/10/29 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
学生个人的自我评价分享
2013/11/05 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
关于爱国的标语
2014/06/24 职场文书
应聘教师自荐信
2015/03/26 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
Element实现动态表格的示例代码
2021/08/02 Javascript
四十九个javascript小知识实用技巧
2021/11/20 Javascript
python3中apply函数和lambda函数的使用详解
2022/02/28 Python
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android