我试图重用代码(键/值)对来构建ec2.Tag和autoscaling.Tag类型,它们也是键/值对。但我认为我对转换/广播了解不足,请告知。预先谢谢你。
panic:接口转换:interface {}是[] struct {键字符串;值字符串},而不是[] * ec2.Tag
func (c *CloudWorks) GetTagCollection() interface{} {
return []struct {
Key string
Value string
}{
{
Key: "key-a",
Value: "value-a",
},
{
Key: "key-b",
Value: "value-b",
},
{
Key: "key-c",
Value: "value-c",
},
}
}
func (c *CloudWorks) GetTags() []*ec2.Tag {
//return []*autoscaling.Tag{
// WORKS
//return []*ec2.Tag{
// {
// Key: aws.String("key1"),
// Value: aws.String("value1"),
// },
// {
// Key: aws.String("key2"),
// Value: aws.String("value3"),
// },
// {
// Key: aws.String("key3"),
// Value: aws.String("value3"),
// },
//}
// FAIL
return c.GetTagCollection().([]*ec2.Tag)
}
编辑 我的目标是避免代码重复,如何在两个函数之间重用键值对,非常感谢。
func (c *CloudWorks) GetEC2Tags() []*ec2.Tag {
return []*ec2.Tag{
{
Key: aws.String("key1"),
Value: aws.String("value1"),
},
{
Key: aws.String("key2"),
Value: aws.String("value3"),
},
}
}
func (c *CloudWorks) GetAutoscalingTags() []*autoscaling.Tag {
return []*autoscaling.Tag{
{
Key: aws.String("key1"),
Value: aws.String("value1"),
},
{
Key: aws.String("key2"),
Value: aws.String("value3"),
},
}
}
答案 0 :(得分:1)
您使用的术语不是conversion/casting
,它是类型断言,用于获取接口的基础值。由于返回数据时用于包装函数内容的接口是struct的一部分。这就是错误背后的原因:
panic:接口转换:interface {}是[] struct {键字符串; 值字符串},而不是[] * ec2.Tag
类型声明是错误的,因为您使用的是[]*ec2.Tag
广告类型,该广告类型应该是从函数[]struct
返回的结构c.GetTagCollection()
的一部分。因此,您应该将assert键入为:
result := c.GetTagCollection().([]struct)
在特殊形式的赋值或初始化中使用的类型声明,因此您可以检查类型声明是否起作用:
v, ok = x.(T)
v, ok := x.(T)
对于接口类型为T且类型为T的表达式x,主要表达式
x.(T)
断言x不是nil,并且x中存储的值的类型为T。符号x。(T)称为类型断言。
更准确地说,如果T不是接口类型,则x。(T)断言 x的动态类型与T相同。在这种情况下,T必须 实现x的(接口)类型;否则类型断言是 无效,因为x不可能存储类型T的值。 T是接口类型,x。(T)断言x的动态类型 实现接口T。
注意:如果类型断言成立,则表达式的值为存储在x中的值,其类型为T。如果类型断言为false,则会发生运行时恐慌。 / p>
编辑:Golang对类型严格。因此,在将值转换为另一种类型之前,您无法将一种类型的值分配给另一种类型。 AWS使用提供的字符串创建自己的类型。举个例子:
package main
import (
"fmt"
)
type MyInt int
func main() {
var x int
x = 1
var y MyInt
y = 1
fmt.Println(x==y)
}
以上代码将引发类型不匹配的错误
prog.go:14:18:无效操作:x == y(类型不匹配的int和 MyInt)
Playground上的工作代码