标签: go-map

如何检查地图中是否包含密钥?

我知道我可以迭代一张地图m,

for k, v := range m { ... }
Run Code Online (Sandbox Code Playgroud)

并寻找一个键,但有一种更有效的方法来测试一个键在地图中的存在吗?

我在语言规范中找不到答案.

dictionary go go-map

666
推荐指数
10
解决办法
46万
查看次数

检查存储大值的映射中是否存在键

k要知道映射中存在的键M1[k]vGo.

if v, ok := M1[k]; ok {
    // key exist
}
Run Code Online (Sandbox Code Playgroud)

'v':非指针类型的值。

如果v很大,使用上述方法仅检查特定键是否存在效率不高,因为它将加载内存中的值v(即使我根据我的理解使用空白标识符_代替v,如果我的这里的理解是错误的)。

有没有一种有效的方法可以检查映射中是否存在键(无需读取/或在内存中分配值)?

我正在考虑创建一个新的地图M2[k]bool来存储信息并在M2每次插入内容时进行输入M1

dictionary go go-map

6
推荐指数
1
解决办法
1738
查看次数

can golang function return interface{}{} - 如何返回地图列表

func getLatestTxs() map[string]interface{}{} {
    fmt.Println("hello")
    resp, err := http.Get("http://api.etherscan.io/api?module=account&action=txlist&address=0x266ac31358d773af8278f625c4d4a35648953341&startblock=0&endblock=99999999&sort=asc&apikey=5UUVIZV5581ENPXKYWAUDGQTHI956A56MU")
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Errorf("etherscan????")
    }
    ret := map[string]interface{}{}
    json.Unmarshal(body, &ret)
    if ret["status"] == 1 {
        return ret["result"]
    }
}
Run Code Online (Sandbox Code Playgroud)

我想map[string]interface{}{}在我的代码中返回。

但我有编译错误 syntax error: unexpected [ after top level declaration

如果我更改map[string]interface{}{}interface{},则不再有编译错误。

我使用的注意力map[string]interface{}{}是因为我想返回一个地图列表。

interface go go-map

5
推荐指数
1
解决办法
7596
查看次数

结构类型作为映射键

我们有以下功能:

func (h *Handler) Handle(message interface{}) error {
    //here there is a switch for different messages
    switch m := message.(type) {
    }
}
Run Code Online (Sandbox Code Playgroud)

此签名已提供且无法更改。处理程序处理大约 20 种不同的消息类型。

现在,有一些消息(大约 4 个)需要特殊的后处理。在不同的包中。

因此,我想这样做:

 func (h *Handler) Handle(message interface{}) error {
        //here there is a switch for different messages

        switch m := message.(type) {
        }
        //only post-process if original message processing succeeds
        postProcessorPkg.Process(message)
    }
Run Code Online (Sandbox Code Playgroud)

现在,在Process函数中,我想快速查找消息类型是否确实是我们需要后处理的类型。我不想在switch这里再做一次。有许多处理程序,在不同的包中,具有不同数量的消息类型,并且应该是通用的。

所以我想在后处理器中注册消息类型,然后进行查找:

func (p *Postprocessor) Register(msgtype interface{}) {
     registeredTypes[msgtype] = msgtype
}
Run Code Online (Sandbox Code Playgroud)

进而

func (p *Postprocessor) …
Run Code Online (Sandbox Code Playgroud)

types interface go go-map

5
推荐指数
1
解决办法
4303
查看次数

检查一个地图是否是另一个地图的子集

这个问题已经用许多其他语言得到了回答。在带有简单映射(无嵌套)的 golang 中,如何确定一个映射是否是另一个映射的子集。例如:map[string]string{"a": "b", "e": "f"}是 的子集map[string]string{"a": "b", "c": "d", "e": "f"}。我想要一个通用方法。我的代码:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := map[string]string{"a": "b", "c": "d", "e": "f"}
    b := map[string]string{"a": "b", "e": "f"}
    c := IsMapSubset(a, b)
    fmt.Println(c)
}

func IsMapSubset(mapSet interface{}, mapSubset interface{}) bool {

    mapSetValue := reflect.ValueOf(mapSet)
    mapSubsetValue := reflect.ValueOf(mapSubset)

    if mapSetValue.Kind() != reflect.Map || mapSubsetValue.Kind() != reflect.Map {
        return false
    }
    if reflect.TypeOf(mapSetValue) != reflect.TypeOf(mapSubsetValue) {
        return false
    }
    if …
Run Code Online (Sandbox Code Playgroud)

generics reflection dictionary go go-map

5
推荐指数
2
解决办法
2651
查看次数

map [string] interface {}和interface {}之间的区别

我想将JSON文件解析为map[string]interface{}

var migrations map[string]interface{}
json.Unmarshal(raw, &migrations)

fmt.Println(migrations["create_user"])
Run Code Online (Sandbox Code Playgroud)

但是我修改了代码以将数据指向interface{}

var migrations interface{}
json.Unmarshal(raw, &migrations)

// compile wrong here
fmt.Println(migrations["create_user"])
Run Code Online (Sandbox Code Playgroud)

我不明白很多关于之间的差异map[string]interface{},并interface{}在上述情况下。

interface go go-map

4
推荐指数
2
解决办法
9762
查看次数

struct的映射的默认值是什么

地图中struct的默认值是多少?如何检查地图值是否已初始化?

type someStruct struct { 
    field1 int
    field2 string
}
var mapping map[int]someStruct

func main() {
    mapping := make(map[int]someStruct)
}

func check(key int) {
    if mapping[key] == ? {}
}
Run Code Online (Sandbox Code Playgroud)

我应该检查nil还是someStruct{}

struct initialization default-value go go-map

2
推荐指数
1
解决办法
3451
查看次数

如何知道2张地图是否引用了相同的数据

Go 映射是对内部数据的引用。这意味着当“复制”地图时,它们最终会共享相同的参考并因此编辑相同的数据。这与使用具有相同项目的另一张地图大不相同。但是,我找不到任何方法来区分这两种情况。

import "fmt"
import "reflect"

func main() {
    a := map[string]string{"a": "a", "b": "b"}
    // b references the same data as a
    b := a
    // thus editing b also edits a
    b["c"] = "c"
    // c is a different map, but with same items
    c := map[string]string{"a": "a", "b": "b", "c": "c"}

    reflect.DeepEqual(a, b) // true
    reflect.DeepEqual(a, c) // true too
    a == b // illegal
    a == c // illegal too
    &a == &b // false
    &a …
Run Code Online (Sandbox Code Playgroud)

go go-map

2
推荐指数
1
解决办法
198
查看次数

如何在 Cgo 中使用 GoMap?

我正在尝试从 C++ 调用 Go。我的代码在地图上运行,我似乎无法使地图与 cgo 一起使用。

main.go:

package main

import (
    "C"
    "fmt"
)

func main() {}

//export PrintMap
func PrintMap(m map[string]string) {
    fmt.Println(m)
}
Run Code Online (Sandbox Code Playgroud)

其中“编译”为main.h

typedef void *GoMap;

extern void PrintMap(GoMap p0);
Run Code Online (Sandbox Code Playgroud)

如何在我的 c++ 代码中成功创建 GoMap 并将其传递给 go 代码?

c++ go cgo go-map

2
推荐指数
1
解决办法
580
查看次数

使用[] [] int切片越界但是使用map [int] [] int

为什么这段代码有效

graph := make(map[int][]int, 0)

graph[0] = append(graph[0], 1)
Run Code Online (Sandbox Code Playgroud)

但是,如果你用graph := make([][]int, 0)我得到的第一行替换panic: runtime error: index out of range?这很奇怪.

go go-map

1
推荐指数
1
解决办法
63
查看次数