【问题标题】:Using a string slice where a slice of empty interface is expected使用字符串切片,其中需要一片空接口
【发布时间】:2014-11-18 04:37:30
【问题描述】:

我正在尝试使用我在网上找到的带有一段字符串的集合库。该集合旨在能够采用泛型类型,但是当我尝试传入一段字符串时,我得到:

不能在 mapset.NewSetFromSlice 的参数中使用 group_users(类型 []string)作为类型 []interface{}

有没有办法在不创建元素类型为 interface{} 的新切片的情况下使用该函数?

集合库可以在这里找到:

我知道这可能很简单,我做错了,但我似乎找不到答案

【问题讨论】:

  • 可以添加库链接吗?

标签: go slice


【解决方案1】:

有没有办法在不创建元素类型为interface{} 的新切片的情况下使用该函数?

并非如此:您可能需要将字符串切片转换为接口切片,如“InterfaceSlice”中所述(这就是为什么您不能直接从[]Type 转到[]interface{}):

var dataSlice []string = foo()
var interfaceSlice []interface{} = make([]interface{}, len(dataSlice))
for i, d := range dataSlice {
    interfaceSlice[i] = d
}

考虑到how an interface{} is structured,您无法快速将一个切片转换为另一个切片。

这是FAQ

【讨论】:

    【解决方案2】:

    VonC 是对的,但如果你真的只想要一个字符串切片,实现起来还是相当简单的

    这是StringSet on play的简单版本

    基本思想是制作一个 Type -> bool 的映射(或者我认为空结构会更节省空间,但 bool 更易于使用/类型)

    关键部分是:

    type StringSet map[string]bool
    func (s StringSet) Add(val string) {
        s[val] = true
    }
    

    然后,检查是否存在可以像 s["key"] 一样简单,因为如果存在则返回 bool true,如果不存在则返回 false(因为 false 是 bool 的默认值)

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2010-11-10
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多