golang 数据处理(七)

本贴最后更新于 1702 天前,其中的信息可能已经时移世异

一、map、struct、json 的互相转换

1、struct 转 json

package main

import (
	"encoding/json"
	"fmt"
)

type Demo struct {
	Akey string
	Bkey int
}

func main() {
	// todo struct转json
	demo := Demo{Akey:"a", Bkey:1}
	jsons, errs := json.Marshal(demo) //转换成JSON返回的是byte[]
	if errs != nil {
		fmt.Println(errs.Error())
	}
	fmt.Println(string(jsons)) //byte[]转换成string 输出
}

2、json 转 struct

package main

import (
	"fmt"
	"encoding/json"
)

type Demo struct {
	Akey string
	Bkey int
}

func main() {
	// todo json转struct
	jsons :=`{"Akey":"a","Bkey":1}`
	var demo_s Demo
	errs :=json.Unmarshal([]byte(jsons), &demo_s)
	if errs != nil {
		fmt.Println(errs.Error())
	}
	fmt.Println(demo_s)
	
}

3、map 转 json

package main

import (
	"fmt"
	"encoding/json"
)

func main() {
	// todo map转json
	demoMap := map[string]interface{}{"Akey":"a", "Bkey":1}
	jsons, errs := json.Marshal(demoMap) //转换成JSON返回的是byte[]
	if errs != nil {
		fmt.Println(errs.Error())
	}
	fmt.Println(string(jsons)) //byte[]转换成string 输出
}

4、 json 转 map

package main

import (
	"fmt"
	"encoding/json"
)

func main() {
	// todo json转map
	var demoMap map[string]interface{}
	jsons :=`{"Akey":"a","Bkey":1}`
	
	errs :=json.Unmarshal([]byte(jsons), &demoMap)
	if errs != nil {
		fmt.Println(errs.Error())
	}
	fmt.Println(demoMap)

}

5、map 转 struct(或:map 转 json,json 转 struct)

package main

import (
	"fmt"
	"github.com/goinggo/mapstructure"
)

type Demo struct {
	Akey string
	Bkey int
}

func main() {
	// todo map转struct(map转json,json转struct)
	demoMap := map[string]interface{}{"Akey":"a", "Bkey":1}
	var demo Demo
	err := mapstructure.Decode(demoMap, &demo)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(demo)
}

6、struct 转 map(或:struct 转 json, json 转 map)

package main

import (
	"fmt"
	"reflect"
)

type Demo struct {
	Akey string
	Bkey int
}

func main() {
	// todo struct转map(struct转json, json转map)
	demo := Demo{Akey:"a", Bkey:1}
	demoMap := make(map[string]interface{})
	
	elem := reflect.ValueOf(&demo).Elem() // value的list
	relType := elem.Type()  // key的list
	for i := 0; i < relType.NumField(); i++ {
		demoMap[relType.Field(i).Name] = elem.Field(i).Interface()
	}
	fmt.Println(demoMap)
	
}

二、类型断言

1、复合类型的 map

如果我们需要定义一个 map,但是这个 map 的 value 即有 string 类型,又有 int 类型,及其他类型该怎么办?直接看代码

comMap := map[string]interface{}{}
comMap["Akey"] = "hello"
comMap["Bkey"] = 100
fmt.Println(comMap)

2、类型断言

我们定义了一个复合类型 map,然后对 map 中的一个 value 进行 byte 转换,如下代码,运行报错,是因为 comT 变量类型没确定,看第二个例子

// 运行报错
package main

import "fmt"

func main() {
	comMap := map[string]interface{}{"t":`[{"a":1},{"b":"c"}]`}
	comT := comMap["t"]
	fmt.Println([]byte(comT))
}

使用 comT.(string),来判断 comT 是否为 string,是的话,ok 变量为 true,result 指代 comT 变量的值,result 变量类型确定,可以使用[]byte(result)方法,将 result 转为字节了

// 运行通过
package main

import "fmt"

func main() {
	comMap := map[string]interface{}{"t":`[{"a":1},{"b":"c"}]`}
	comT := comMap["t"]
	result, ok := comT.(string)
	if ok{
		fmt.Println([]byte(result))
	}
}
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 374 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...