Go 铸造兼容但不同的地图切片
我正在使用两个库,其中一个定义了一个类型:Go 铸造兼容但不同的地图切片,go,Go,我正在使用两个库,其中一个定义了一个类型: type Attrs map[string]string 另一个定义是: type StringMap map[string]string 第一个库中的函数返回一个[]Attrs,另一个库所需的struct有一个字段[]StringMap,需要设置该字段。尝试使用简单赋值或以([]StringMap)(attrs)形式的强制转换只会导致错误: ./wscmd.go:8:22: cannot convert attrs (type []mpd.Att
type Attrs map[string]string
另一个定义是:
type StringMap map[string]string
第一个库中的函数返回一个[]Attrs
,另一个库所需的struct有一个字段[]StringMap
,需要设置该字段。尝试使用简单赋值或以([]StringMap)(attrs)
形式的强制转换只会导致错误:
./wscmd.go:8:22: cannot convert attrs (type []mpd.Attrs) to type []StringMap
那么,如何才能将这些联系起来
编辑:好,显然这是语言限制(booo-hooo)。它能被不安全的指针移到一边吗 您可以这样做,但它绕过了Go的类型安全性,这可能会导致问题,具体取决于实现类型
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
type Attrs map[string]string
type StringMap map[string]string
a := Attrs{"key1": "val1", "key2": "val2"}
b := Attrs{"key3": "val3", "key4": "val4"}
attrs := []Attrs{a, b}
// This is what you're asking for, keep in mind this circumvents the type safety provided by go
sh := *(*reflect.SliceHeader)(unsafe.Pointer(&attrs))
unsafeStrMaps := *(*[]StringMap)(unsafe.Pointer(&sh))
fmt.Println(unsafeStrMaps)
// This would be the preferred way of casting the array
strMaps := []StringMap{}
for _, v := range attrs {
strMaps = append(strMaps, StringMap(v))
}
fmt.Println(strMaps)
}
对于类型安全性来说,只需迭代
[]Attrs
切片并附加到[]StringMap
为什么不只迭代attr并将数据放入StringMap中呢?性能原因,这些可能是巨大的。结构基本上是一样的,必须有一种使用它们的方法。类型别名可能会有所帮助。“好吧,显然这是语言限制(booo-hooo)。它可以被不安全的指针搁置一旁吗?”——这是一个可怕的问题。用一个循环。嗯,这是一个完全不恰当的回应,是一个毫无根据的否决票。就用一个循环?分配两个定义完全相同的容器?我认为将其称为语言限制是公平的,因为其他实用语言允许它,这使得,通过这个特殊的特性来比较,它们变得更加有限。考虑这个有效的C++代码: