go struct转map_golang map

go struct转map_golang mapGo字符串转Map和Map的嵌套取值想用Go写爬虫联系一下语法的,结果数据类型转换还不熟悉。map嵌套取值就会报错typeinterface{}doesnotsupportindexing字符串转Map//示例字符串resString:=`{ “args”:{}, “headers”:{ “Accept-Encoding”:”gzip”, “Host”:”httpbin.org”, “User-Agent”:”GRequests/0.10

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Go字符串转Map 和 Map的嵌套取值

想用Go写爬虫联系一下语法的,结果数据类型转换还不熟悉。
强行 map嵌套取值就会报错type interface {} does not support indexing

字符串转Map

// 示例字符串
resString := ` { "args": {}, "headers": { "Accept-Encoding": "gzip", "Host": "httpbin.org", "User-Agent": "GRequests/0.10", "X-Amzn-Trace-Id": "Root=1-5f3f3xxxxxxccdc4068" }, "origin": "11.11.11.22", "url": "http://httpbin.org/get" } `
func StringToMap(content string)  map[string]interface{ 
   }{ 
   
	var resMap map[string]interface{ 
   }
	err := json.Unmarshal([]byte(content), &resMap)
	if err != nil { 
   
		fmt.Println("string转map失败", err)
	}
	return resMap
}

resMap := StringToMap(resString)
fmt.Println("url取值", resMap["url"], reflect.TypeOf(resMap["url"]))

其中resMap["url"]是一个insterface类型,如下转成string

resMap["url"].(string)

Map嵌套取值

接着上面的例子,比如要取headers里面的Host
如果是直接

resMap["headers"]["Host"]

就会报错 type interface {} does not support indexing

// 内部嵌套的map 也要转换
innerMap := resMap["headers"].(map[string]interface{ 
   })

fmt.Println("Host取值", innerMap["Host"], reflect.TypeOf(innerMap["Host"]))

我使用了Go二次封装的http库 grequests https://github.com/levigross/grequests

对目标网址发送请求,返回一个json类型字符串。
目标网址Get请求: http://httpbin.org/get
会得到一个Json字符串

{
    "args": {},
    "headers": {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Host": "httpbin.org",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Macintosh; xx) Appit/537.3xxxxx6 (KxxxxHTML, like Gecko) Chrome/84.0.414xxx25 xxxxx37.36",
        "X-Amzn-Trace-Id": "Root=1-5f3f3bae-cxxxxxxdb4121b44de07769"
    },
    "origin": "111.111.111.111",
    "url": "http://httpbin.org/get"
}

完整代码

package main

import (
	"encoding/json"
	"fmt"
	"github.com/levigross/grequests"
	"reflect"
)

func main() { 
   
	//You can modify the request by passing an optional RequestOptions struc
	//resp, err := grequests.Get("http://httpbin.org/get", nil)
	//
	//if err != nil { 
   
	// fmt.Println("Unable to make request: ", err)
	//}
	//resString := resp.String()
	//
	//fmt.Println(resString)
	resString := ` { "args": {}, "headers": { "Accept-Encoding": "gzip", "Host": "httpbin.org", "User-Agent": "GRequests/0.10", "X-Amzn-Trace-Id": "Root=1-5f3f3e21-44e7f0e4cec2d98cccdc4068" }, "origin": "116.233.234.60", "url": "http://httpbin.org/get" } `
	var resMap map[string]interface{ 
   }

	err := json.Unmarshal([]byte(resString), &resMap)

	if err != nil { 
   
		fmt.Println("string转map失败", err)
	}
	
	// go type interface {} does not support indexing
	fmt.Println("args取值", resMap["args"], reflect.TypeOf(resMap["args"]))
	fmt.Println("origin取值", resMap["origin"], reflect.TypeOf(resMap["origin"]))
	
	// 内部嵌套的map 也要转换
	innerMap := resMap["headers"].(map[string]interface{ 
   })

	fmt.Println("Host取值", innerMap["Host"], reflect.TypeOf(innerMap["Host"]))
	
}

输出

args取值 map[] map[string]interface {}
origin取值 116.233.234.60 string
Host取值 httpbin.org string

还有个二次封装的请求库,看起来也不错

github.com/imroc/req

总结

Go 这些数据类型操作,还是有些繁琐,相对比Python这些操作,就显得很简洁了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195324.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • intellij idea安装步骤2019.3_intellij idea安装教程

    intellij idea安装步骤2019.3_intellij idea安装教程IntelliJIDEA2022.1保姆级安装教程

  • linux dlopen 内存版本,dlopen函数详解

    linux dlopen 内存版本,dlopen函数详解Linux提供了一套API来动态装载库。下面列出了这些API:-dlopen,打开一个库,并为使用该库做些准备。-dlsym,在打开的库中查找符号的值。-dlclose,关闭库。-dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。C语言用户需要包含头文件dlfcn.h才能使用上述API。glibc还增加了两个POSIX标准中没有的API:…

    2022年10月27日
  • 电脑定时开机方法「建议收藏」

    电脑定时开机方法「建议收藏」让电脑自动开机方法一:BIOS首先开机后按住Delete键,就是平常常用的删除按键(见图1),然后就会进入到BIOS界面。虽然是一个满眼E文的蓝色世界,但不要害怕,没有问题的。图2在BIOS设置主

  • 【Python】python面试题

    【Python】python面试题一些Python面试题注:本面试题来源于网络,部分内容摘自http://www.cnblogs.com/goodhacker/p/3366618.html1.(1)python下多线程的限制以及

  • 格雷码与二进制的转换[通俗易懂]

    格雷码与二进制的转换[通俗易懂]一、什么是格雷码?格雷码,又叫循环二进制码或反射二进制码,格雷码是我们在工程中常会遇到的一种编码方式,它的基本的特点就是任意两个相邻的代码只有一位二进制数不同,这点在下面会详细讲解到。格雷码的基本特点就是任意两个相邻的代码只有一位二进制数不同,这点很重要。常用的二进制数与格雷码间的转换关系如下表:二、二进制格雷码与自然二进制码的互换1、二进制码转换成二进制格雷码  二进制码转换成二进制格雷码,

    2022年10月17日
  • ingress的用法与原理[通俗易懂]

    ingress的用法与原理[通俗易懂]前言我们知道真正提供服务的是后端的pod,但是为了负载均衡,为了使用域名,为了….,service诞生了,再后来ingress诞生了,那么为什么需要有Ingress呢?先看看官网怎么说的:In

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号