【Go学习笔记】 string转Map 和 Map嵌套取值 和 interface转string

摘要:
Go字符串转换为Map和Map的嵌套值希望使用Go编写爬虫来练习语法,结果数据类型转换不熟悉=Nil{fmt.Println}returnresMap}resMap:=StringToMapfmt。Println,其中resMap[“url”]是一种接口类型,它被转换为stringressMap[“url”],如下所示。例如,如果要在标头中获取Host值,如果它是直接resMap[“headers”][“Host”],则会报告错误。typeinterface{}不支持索引//内部嵌套映射也需要转换为innerMap:=resMap[“headers”]。fmt格式。Println我使用了Go二级封装的http库grequestshttps://github.com/levigross/grequests向目标URL发送请求并返回json类型字符串。目标URL获取请求: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,应用程序/签名交换;v=b3;q=0.9”,“Accept Encoding”:“gzip,deflate”,“Accept Language”:“zh-CN,zh;q=0.9”,“Host”:“httpbin.org”,“升级不安全请求”:“1”,“用户代理”:“Mozilla/5.0Appit/537.36xxxxx6Crome/84.0.414xxx25xxxxx37.36”,“X-Amznznzn“跑道-Id”:“根=1-5f3f3bae-cxxxxxxxdb4121b44de07769”},“原点”:“111.111.11.11”,“url”:“http://httpbin.org/get“}完成代码包mainimportfuncmain(){//您可以通过assingoptionalRequestOptionsstruc//resp修改请求,err:=grequests.Get//ifer!
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库 grequestshttps://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这些操作,就显得很简洁了。

免责声明:文章转载自《【Go学习笔记】 string转Map 和 Map嵌套取值 和 interface转string》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇es在win下添加数据(二)Activity 的 36 个问题,你还记得几个?(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JSSDK实现微信自定义分享---java 后端获取签名信息

一、首先说下关于微信Access_token的问题,微信Access_token分为2中: 1.授权token获取方式: 这种token需要code值(如何获取code值查看官方文档) 1 "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret="...

Swift网络封装库Moya中文手册之Targets

Targets 使用Moya,我们首先需要定义一个target - 这通常是继承 TargetType 协议的 枚举 变量。接下来,你的app只需要处理这些targets,也就是一些你希望调用API完成的操作。例如:FavouriteTweet(tweetID: String)。 示例代码: public enum GitHub { case Ze...

xml转json和实体类的两种方式

本文为博主原创,未经允许不得转载: xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛, 在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到的一些方法: 一. 使用XMLSerializer 将xml转为json格式 1.引入jar包: <dependency> <g...

android蓝牙通讯开发(详细)

新建一个工程之后,我们可以先看到界面左边的项目栏,我们可以看到,除了app目录以外,大多数的文件和目录都是自动生成的,我们也不需要对他们进行修改,而app目录之下的文件才是我们工作的重点。下面,我先对app目录下的内容进行一些讲解。 1.AndroidManifest.xml 这是整个项目的配置文件,我们在程序中定义的四大组件都需要在这里注册,另外,也可以...

Swing菜单与工具栏(二)

6.1.4 JMenuItem类 JMenuItem组件是用户可以在菜单栏上选择的预定义组件。作为AbstractButton的子类,JMenuItem是一个特殊的按钮组件,其行为类似于JButton。除了作为AbstractButton的子类,JMenuItem类共享JButton的数据模型(ButtonModel接口与DefaultButtonMode...

Delphi 匿名函数的几个实际应用(二)

Timing Anonymous Methods 计时功能匿名函数   开发者们经常需要添加计时代码到一个已有的常规过程中,比较他们的相关速度。前面例子已经使用了几次实例,指出Uncode字符执行速度。对比两个代码片段,比较他们的执行毫秒数,妳可以写出下面内容(在本书第二章的“转换字符”例子):   [delphi]view plaincopy...