首页 > 解决方案 > go:指针或布尔映射作为接口映射

问题描述

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

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)
}

我似乎无法将这些地图传递给这个函数(示例)。请问如何才能正确完成,或者如果我遗漏了什么,为什么不能完成?

标签: go

解决方案


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

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是要走的路。


推荐阅读