gpt4 book ai didi

go - 类型转换为相似类型

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:48 26 4
gpt4 key购买 nike

我正在尝试重新使用代码(键/值)对来构建 ec2.Tag 和 autoscaling.Tag 类型,它们也是键/值对。但是我认为我对转换/转换了解不够,请指教。提前谢谢你。

panic: interface conversion: interface {} is []struct { Key string; Value string }, not []*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"),
},
}

}

最佳答案

您使用的术语不是conversion/casting,它是类型断言,用于获取接口(interface)的基础值。由于您在返回数据时用于包装函数内容的接口(interface)是一个结构片段。这就是错误背后的原因:

panic: interface conversion: interface{} is []struct { Key string; Value string }, not []*ec2.Tag

类型断言是错误的,因为您正在使用 []*ec2.Tag 广告类型,它应该是从函数 返回的结构 []struct 的 slice >c.GetTagCollection()。所以你应该为该类型键入断言:

result := c.GetTagCollection().([]struct)

在特殊形式的赋值或初始化中使用的类型断言,因此您可以检查类型断言是否有效:

v, ok = x.(T)
v, ok := x.(T)

对于接口(interface)类型的表达式x和类型T,主表达式

x.(T)

断言 x 不为 nil 并且存储在 x 中的值属于 T 类型。符号 x.(T) 称为类型断言。

More precisely, if T is not an interface type, x.(T) asserts that the dynamic type of x is identical to the type T. In this case, T must implement the (interface) type of x; otherwise the type assertion is invalid since it is not possible for x to store a value of type T. If T is an interface type, x.(T) asserts that the dynamic type of x implements the interface T.

注意:如果类型断言成立,则表达式的值为存储在 x 中的值,其类型为 T。如果类型断言为假,则会发生运行时 panic 。

编辑: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: invalid operation: x == y (mismatched types int and MyInt)

关于 Playground 的工作代码

关于go - 类型转换为相似类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com