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
用golang如何替换某个文件中的字符串
Apr 25 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang import自定义包方式
Apr 29 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
Go gorilla/sessions库安装使用
Aug 14 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
我的论坛源代码(七)
2006/10/09 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
PHP实现微信发红包程序
2015/08/24 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
javascript断点调试心得分享
2016/04/23 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
探究Python中isalnum()方法的使用
2015/05/18 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
python3 xpath和requests应用详解
2020/03/06 Python
python 元组的使用方法
2020/06/09 Python
python map比for循环快在哪
2020/09/21 Python
分享一个python的aes加密代码
2020/12/22 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
DataReader和DataSet的异同
2014/12/31 面试题
公司年会晚宴演讲稿
2014/01/06 职场文书
大型营销活动计划书
2014/04/28 职场文书
员工年终考核评语
2014/12/31 职场文书
党章学习心得体会2016
2016/01/14 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
Python读写yaml文件
2022/03/20 Python
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL