golang go lang中的可扩展注册机

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang go lang中的可扩展注册机相关的知识,希望对你有一定的参考价值。

package main

import "fmt"

//multitype of register slot in virtual machin
type register struct {
	i int
	b bool
	s string
}


func main() {
	table := make([]register, 10)
	table[0].s += "hello"
	table[1].i += 5
  fmt.Println(table)
  /*[{0 false hello} {5 false } {0 false } {0 false } {0 false } {0 false } {0 false } {0 false } {0 false } {0 false }]*/
}

Go Lang 帮助 - 访问接口的数组/切片

【中文标题】Go Lang 帮助 - 访问接口的数组/切片【英文标题】:Go Lang Help - Accessing Array/Slice of interfaces 【发布时间】:2016-10-13 07:54:14 【问题描述】:

我正在尝试使用嵌套数据解码 GO 中的动态/随机 JSON 响应

    body, _ := ioutil.ReadAll(response.Body)
    resp := make(map[string]interface)
    err = json.Unmarshal(body, &resp)

    fmt.Printf("BODY: %T<\n", body)
    fmt.Printf("BODY: %s<\n", body)
    fmt.Printf("RESP: %s<\n", resp)
    fmt.Printf("RESP: %T<\n", resp)
    fmt.Printf("RESP[results]: %T<\n", resp["results"])
    fmt.Printf("RESP[results]: %s<\n", resp["results"])

body 是来自 HTTP 服务器的 JSON 结果,我对其进行解组,结果看起来是一个字节片。

正文:[]uint8

BODY: "results":["code":500.0,"errors":["配置文件 'c2-web-2.conf' 已经存在。"],"status":"对象不能已创建。"]

所以我将它解组为 resp 并且按预期工作。

RESP:地图[字符串]接口

RESP: map[results:[map[code:%!s(float64=500) 错误:[配置文件 'c2-web-2.conf' 已经存在。] 状态:无法创建对象。]] ]

我可以通过关键结果访问地图。

RESP[结果]:[]接口

RESP[results]:[map[code:%!s(float64=500) 错误:[配置文件 'conf.d/hosts/c2-web-2.conf' 已经存在。] 状态:对象无法]]

现在我想访问它的“代码”、“错误”和“状态”,它们位于 resp[“results”] 这看起来像一个数组或切片,我尝试过索引它,但我得到了错误在编译时

./create_host.go:62: 无效操作:resp["results"][0] (type interface 不支持索引)

我做了很多谷歌搜索,尝试在 resp["results"] 等中解组数据,但几天后我没有取得太大进展。

我应该如何访问似乎是数组成员的地图?无法保证数据结构,因此我无法创建结构并将其解组。

谢谢

【问题讨论】:

【参考方案1】:

一位同事提供了下面的代码片段,可以访问我正在寻找的地图条目。

    respBody, _ := ioutil.ReadAll(response.Body)

    var rsp interface
    if err := json.Unmarshal(respBody, &rsp); err != nil 
            log.Fatal(err)
    
    resultMap := rsp.(map[string]interface)["results"].([]interface)[0].(map[string]interface)
    fmt.Printf("test: %s<\n", resultMap["errors"] )

测试:[配置文件'c2-web-2.conf'已经存在。]

【讨论】:

【参考方案2】:

我相信你需要做一个类型断言。你有一个interface,但你需要某种切片来索引。试试resp["results"].([]interface)[0]? (抱歉,我自己没有机会对此进行测试。)

【讨论】:

以上是关于golang go lang中的可扩展注册机的主要内容,如果未能解决你的问题,请参考以下文章

golang go中的可附加intlist结构,它使用map作为其实现

Golang Go语言中的 defer 怎么使用?

golang 在Go lang发送并获取Json

golang 在go中注册堆栈实现

golang 来自http://www.darul.io/post/2015-07-22_go-lang-simple-reverse-proxy

Go Lang 帮助 - 访问接口的数组/切片