原文链接:http://www.zhoubotong.site/post/23.html
遍历结构体
如何实现遍历结构体字段? 好吧,言归正传!举个例子:
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))
- }
- }
输出:
字段索引 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)
- }
- }
输出:
切片索引 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])
- }
- }
输出:
1=>Php
2=>Go
3=>Python3
4=>C#
这样输出的结果运行多次也不会改变顺序。