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)


相关推荐

  • mqtt服务器搭建php,Windows搭建MQTT服务器

    mqtt服务器搭建php,Windows搭建MQTT服务器MQTT,是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备:轻量级的消息订阅和发布(publish/subscribe)协议建立在TCP/IP协议之上物联网,MQTT在这方面应用较多这里MQTT分客户端服务器端网上的确有很多代码,但是服务器端的配置很少,而MQTT是通过TCP/IP协议连接的,MQTT是协议类型HTTP协议一样,也需要对应的服…

  • java打开dex文件_dex文件反编译工具(Dedexer)

    java打开dex文件_dex文件反编译工具(Dedexer)dedexer是AndroidDEX文件反汇编工具,目前网上唯一一个反编译dex文件的反编译工具。如果你用过ant编译java程序,那么编译Dedexer是一件非常简单的工作。该软件要求您的电脑要装有Java环境(进入下载jre.Java环境)才能正常使用dedexer与dexdump相比至少有3个优点一,不需要在android模拟器中运行。二,把dex文件按照java源代码package的目录…

  • wifi linux驱动_嵌入式系统Android移植

    wifi linux驱动_嵌入式系统Android移植背景:需要更换wifi厂家提供的驱动程序,此驱动不是insmod测试程序,而是需要编译进内核,开机自动挂载的。insmod挂载驱动通常是将驱动源码,使用对应的交叉编译工具链编为xx.ko的文件,手动insmodxx.ko进行使用。1:将驱动源码放入内核目录下的/drivers/net/wireless/realtek目录。2:查看驱动源码目录下的Kconfig和Makefile是否齐全,…

  • [POJ 2976]Dropping tests(0-1分数规划)

    [POJ 2976]Dropping tests(0-1分数规划)

  • android bioset 进程,kthrotlds(WatchDogs变种)查杀方法「建议收藏」

    android bioset 进程,kthrotlds(WatchDogs变种)查杀方法「建议收藏」virus.win32.parite.H病毒的查杀方法virus.win32.parite.H病毒的查杀方法昨天电脑中了virus.win32.parite.H病毒,搞了2个多小时最终搞定了.以下记录下我的解决方法.第一步:下载Win32.Parit…Linux系统木马后门查杀方法详解木马和后门的查杀是系统管理员一项长期需…

  • k8s有哪些资源_什么是k8s

    k8s有哪些资源_什么是k8sk8sNamespacePodLabelDeploymentServiceNamespace概述Namespace是kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离。默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组

发表回复

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

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