添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
dataMap := make(map[string][]User) json.Unmarshal([]byte(data), &dataMap) for k, v := range dataMap { log.Printf(`%v,%v`, k, v) "ret":200, "data":{ "32f49e76d7d16b76f0d49f15710b447236acfc90":{ "torrent":[ "sid":2, "torrent_id":55171, "info_hash":"32f49e76d7d16b76f0d49f15710b447236acfc90" "cf7d88fd656d10fe5130d13567aec27068b96676":{ "torrent":[ "sid":10, "torrent_id":36, "info_hash":"8bf47a8baa8bf7927ec61a850959bca8405482f5" "sid":1, "torrent_id":7233, "info_hash":"07bb8defd21288a30a54ad793fe615f81afdbb2b" "sid":8, "torrent_id":5821, "info_hash":"a69b89a8df716982ecceff4b98c532fc538501ae" "msg":"", "version":"1.5.0"

处理的方法和例一类似

package main
import (
	"encoding/json"
	"fmt"
type ApiSitesInfoHash struct {
	Ret  int `json:"ret"`
	Data Data `json:"data"`
	Msg     string `json:"msg"`
	Version string `json:"version"`
type Data map[string]Torrents   //自定义类型
type Torrents struct{ //结构体
	Torrent []Torrent `json:"torrent"`
type Torrent struct{
	Sid int `json:"sid"`
	Torrent_id int `json:"torrent_id"`
	Info_hash string `json:"info_hash"`
func main(){
	r:=`{
    "ret":200,
    "data":{
        "32f49e76d7d16b76f0d49f15710b447236acfc90":{
            "torrent":[
                    "sid":2,
                    "torrent_id":55171,
                    "info_hash":"32f49e76d7d16b76f0d49f15710b447236acfc90"
        "cf7d88fd656d10fe5130d13567aec27068b96676":{
            "torrent":[
                    "sid":10,
                    "torrent_id":36,
                    "info_hash":"8bf47a8baa8bf7927ec61a850959bca8405482f5"
                    "sid":1,
                    "torrent_id":7233,
                    "info_hash":"07bb8defd21288a30a54ad793fe615f81afdbb2b"
                    "sid":8,
                    "torrent_id":5821,
                    "info_hash":"a69b89a8df716982ecceff4b98c532fc538501ae"
    "msg":"",
    "version":"1.5.0"
	var dataMap ApiSitesInfoHash
	json.Unmarshal([]byte(r), &dataMap)
	for k, v := range dataMap.Data {
		fmt.Println(k)
		//fmt.Printf("%v",v.Torrent)
		for _,v1:=range v.Torrent{
			fmt.Println(v1.Sid,v1.Torrent_id,v1.Info_hash)
			//fmt.Printf("%v",v1.Sid)

再补充一个例子

解析具有动态Key的对象

下面再做一下复杂的变化,如果把对象数组变为以FruitId作为属性名的复合对象(object of object)比如:

"Fruit" : {
    "1": {
        "Name": "Apple",
        "PriceTag": "$1"
    "2": {
        "Name": "Pear",
        "PriceTag": "$1.5"

每个Key的名字在声明类型的时候是不知道值的,这样该怎么声明呢,答案是把Fruit字段的类型声明为一个Keystring类型值为Fruit类型的map

type Fruit struct {
    Name string `json:"name"`
    PriceTag string `json:"priceTag"`
type FruitBasket struct {
    Name    string             `json:"name"`
    Fruit   map[string]Fruit   `json:"fruit"`
    Id      int64              `json:"id"`
    Created time.Time          `json:"created"`

可以运行下面完整的代码段试一下。

package main
import (
    "fmt"
    "encoding/json"
    "time"
func main() {
    type Fruit struct {
        Name string `json:"name"`
        PriceTag string `json:"priceTag"`
    type FruitBasket struct {
        Name    string             `json:"name"`
        Fruit   map[string]Fruit   `json:"fruit"`
        Id      int64              `json:"id"`
        Created time.Time          `json:"created"`
    jsonData := []byte(`
        "Name": "Standard",
        "Fruit" : {
              "1": {
                    "name": "Apple",
                    "priceTag": "$1"
              "2": {
                    "name": "Pear",
                    "priceTag": "$1.5"
        "id": 999,
        "created": "2018-04-09T23:00:00Z"
    var basket FruitBasket
    err := json.Unmarshal(jsonData, &basket)
    if err != nil {
         fmt.Println(err)
    for _, item := range basket.Fruit {
    fmt.Println(item.Name, item.PriceTag)
                    一般的用法可以参考https://www.cnblogs.com/yorkyang/p/8990570.html本文主要介绍json中动态字段 动态key的处理方法例子一json字段{    "friends": [        {            "id": 0,            "name": "Robinson Woods"        }   ...
	t1 := Transport{Time: "22", Id: 44}
	st = append(st, t1)
	t2 := Transport{Time: "66", Id: 88}
	st = append(st, t2)
	st_json, _ := json.Marshal(s
VScode通过安装第三方开源Redis库来连接Redis 
1)  使用第三方开源的redis库: github.com/garyburd/redigo/redis 
2)  在使用Redis前,先安装第三方Redis库,在GOPATH路径下执行安装指令:
D:\goproject>go get github.com/garybu...
				
目前在做一个微型网关,一期的功能就是接收请求、匹配路由、鉴权、转发请求,再把响应接住并动态添加字段最后返回给调用方。 简单来说就是把请求方的响应接住,并在外层加上网关层特有的字段,如下 "response": { "data":[], "traceId":"1212121212112" 其 response 和 traceId 就是网关动态加的,这个可以利用 golang 里的 map 属性来实现。 ret := map[string]interface{}{} data :=
Golang ,结构体的字段是在编译时确定的,因此不能动态增加字段。如果需要动态增加字段,可以考虑使用 map 类型,将字段名作为 key字段作为 value。 以下是一个示例代码: ```go type Person struct { Name string Age int Extra map[string]interface{} func main() { p := Person{Name: "John", Age: 30, Extra: make(map[string]interface{})} p.Extra["Address"] = "123 Main St." p.Extra["Phone"] = "123-456-7890" fmt.Println(p) // Output: {John 30 map[Address:123 Main St. Phone:123-456-7890]} 在上面的代码,我们为 `Person` 结构体类型增加了一个名为 `Extra` 的字段,类型为 `map[string]interface{}`。`Extra` 字段可以存储任意数量和类型的额外字段。 接着,我们创建了一个名为 `p` 的 `Person` 结构体实例,并在 `Extra` 字段动态添加了两个字段:`Address` 和 `Phone`。 最后,我们使用 `fmt.Println` 函数打印出结构体变量 `p` 的。输出结果为 `{John 30 map[Address:123 Main St. Phone:123-456-7890]}`,其 `map[Address:123 Main St. Phone:123-456-7890]` 表示 `Extra` 字段