Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 铸造兼容但不同的地图切片_Go - Fatal编程技术网

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++代码: