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在函数退出后子协程的退出问题
Apr 30 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
Go标准容器之Ring的使用说明
May 05 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
入门学习Go的基本语法
Jul 07 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Go 中的空白标识符下划线
Mar 25 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang 入门 之url 包
May 04 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 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
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
php实现mysql封装类示例
2014/05/07 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
python实现绘制树枝简单示例
2014/07/24 Python
解析Python的缩进规则的使用
2019/01/16 Python
python多线程并发实例及其优化
2019/06/27 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
Python urllib2运行过程原理解析
2020/06/04 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
Java的for语句中break, continue和return的区别
2013/12/19 面试题
给排水工程师岗位职责
2013/11/21 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
财经学院自荐信范文
2014/02/02 职场文书
项目建议书怎么写
2014/05/15 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
四风对照检查材料范文
2014/09/27 职场文书
匿名检举信范文
2015/03/02 职场文书
2016公司年会通知范文
2015/04/25 职场文书
优秀创业计划书分享
2019/07/19 职场文书
Golang 字符串的常见操作
2022/04/19 Golang
spring boot实现文件上传
2022/08/14 Java/Android