Go语言自定义类型指针使用疑问:为何返回切片参数地址需显式类型转换?
为什么返回
&cards编译失败,需要类型转换? 这是因为Go的类型系统中,自定义命名类型和它的底层类型是完全不同的类型,它们的指针类型自然也不兼容,Go不会为指针类型做隐式转换,必须显式指定类型转换。
拆解你的三个例子:
- 第一个合法的例子
func newDeck(cards ...string) deck { return cards }
这里cards的类型是[]string,而deck是基于[]string的自定义类型。Go允许底层类型到自定义命名类型的隐式转换,所以return cards等价于return deck(cards),编译器会自动帮你完成转换,因此合法。
- 第二个合法的例子
func str(n []string) *[]string { return &n }
这个很直观:n是[]string类型,&n就是*[]string类型,和函数返回值类型完全匹配,当然可以直接返回。
- 第三个不合法的例子
func newDeck(cards ...string) *deck { return &cards // 编译失败 }
这里cards是[]string,&cards的类型是*[]string,但函数要求返回*deck。虽然deck的底层是[]string,但*deck和*[]string是两个不同的指针类型——Go不会把指向底层类型的指针,隐式转换成指向自定义命名类型的指针。
这时候就需要显式的类型转换,告诉编译器把*[]string转换成*deck,也就是你用到的return (*deck)(&cards)。
另一种等价写法
你也可以先把cards转换成deck类型,再取它的指针,效果是一样的:
func newDeck(cards ...string) *deck { d := deck(cards) return &d }
内容的提问来源于stack exchange,提问作者Halil Yıldırım
相关产品推荐
相关产品推荐

