将类型转换为相似类型

时间:2018-09-01 06:42:13

标签: go aws-lambda aws-sdk

我试图重用代码(键/值)对来构建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"),
    },
}

}

1 个答案:

答案 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上的工作代码