Go 戈朗不同类型的切片

Go 戈朗不同类型的切片,go,slice,Go,Slice,上下文:我想使用golang中的切片数据结构来制作二维特征向量。该特征向量应该是由不同类型的片段组成的片段,有时包括字符串、int、float64等 到目前为止,我可以通过一个映射(如下)来实现这一点,有没有一种方法可以通过一个切片来实现这一点 map := make(map[int]interface{}} 应该是什么样的: featureVector := []interface{[]int, []float64, []string ...} 正如预期的那样,您只是使用了错误的语法。切片

上下文:我想使用golang中的切片数据结构来制作二维特征向量。该特征向量应该是由不同类型的片段组成的片段,有时包括字符串、int、float64等

到目前为止,我可以通过一个映射(如下)来实现这一点,有没有一种方法可以通过一个切片来实现这一点

map := make(map[int]interface{}}
应该是什么样的:

featureVector := []interface{[]int, []float64, []string ...}

正如预期的那样,您只是使用了错误的语法。切片的元素类型是
接口{}
,因此初始化它的方法应该类似于
[]接口{}{…}
,如本例所示:

featureVector := []interface{}{[]int{1, 2}, []float64{1.2, 2.2}, []string{"a", "b"}}
你可以像对待其他切片一样对待它:

featureVector = append(featureVector, []byte{'x', 'y'})
fmt.Printf("%#v", featureVector)
输出(在上尝试):

但是要知道,由于元素类型是
接口{}
,因此任何人都不能附加非片:

featureVector = append(featureVector, "abc") // OK

这也适用于
map
解决方案。

如果我们是技术性的,字符串本质上就是切片。它们可以自由转换为
[]字节
,也可以自由转换回。唯一的功能区别是切片是不可变的,它们的切片头结构是一个更小的机器字,因为它们的cap和len在定义上是相等的。@Kaedys添加单个
字符串
值只是一个例子,我也可以使用
int
。如果我们这样做的话:
string
实际上是一个只读的字节片,但它不是一个片。语言规范允许在许多情况下将其视为类似于切片,但仍然
reflect.TypeOf(“abc”).Kind()==reflect.slice
false
featureVector = append(featureVector, "abc") // OK