【问题标题】:go: map of pointers or bools as map of interfacego:指针或布尔映射作为接口映射
【发布时间】:2021-10-11 20:38:18
【问题描述】:

假设我有不同类型的映射,其中包括布尔值和指针,并希望以单一方式将它们传递给某个函数:

type Blah struct {
    name string
}

var mapBlah map[string]*Blah = make(map[string]*Blah)
var mapBool map[string]bool = make(map[string]bool)

func joinKeys(m map[string]interface{}) string {
    // returns strings.Join(keys of map)
}

我似乎无法将这些映射传递给这个函数 (example)。如何正确完成,或 如果我遗漏了什么,为什么不能完成?

【问题讨论】:

  • 你可以做的是joinKeys(m interface{})
  • 那我应该在函数内部做什么呢?各种地图的切换?
  • 是的,这里是example如何使用反射来处理或类型开关。
  • 是的,我目前正在使用反射方法,但想知道我是否遗漏了一些更直接的方法。遗憾的是,在这种情况下,类型切换方法看起来不太好:)

标签: go


【解决方案1】:

当您已经知道类型时,我认为切换类型将是有益的,如下所示。

package main

import (
    "fmt"
    "strings"
)

type Blah struct {
    name string
}

var mapBlah map[string]*Blah = make(map[string]*Blah)
var mapBool map[string]bool = make(map[string]bool)

func joinKeys(m interface{}) string {
    var a []string
    switch v := m.(type) {
    case map[string]*Blah:
        for k, _ := range v {
            a = append(a, k)
        }
    case map[string]bool:
        for k, _ := range v {
            a = append(a, k)
        }
    default:
    }

    return strings.Join(a, ",")

}

func main() {
    mapBlah["1B"] = &Blah{name: "first"}
    mapBlah["2B"] = &Blah{name: "second"}
    fmt.Println(joinKeys(mapBlah))

    mapBool["1Bool"] = true
    fmt.Println(joinKeys(mapBool))
}

对于一些性能权衡的更动态的方式reflection 是要走的路。

【讨论】:

  • 谢谢!不完全是我梦寐以求的,但因为它为我阐明了 Go 的当前状态,所以这应该被接受为答案。抱歉耽搁了:)
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2018-02-02
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多