我正在使用自定义类型,当涉及如下指针时,我遇到了问题。以下代码有效:package mainimport ( "fmt")type deck []stringfunc newDeck(cards ...string) deck { return cards}下面的代码也是有效的:package mainfunc str(n []string) *[]string {return &n}以下代码无效。为什么这样?我必须写一个类型转换return (*deck)(&cards)package mainimport ( "fmt")type deck []stringfunc newDeck(cards ...string) *deck { return &cards // compiles with return (*deck)(&cards)}
1 回答
Smart猫小萌
TA贡献1911条经验 获得超7个赞
关于赋值(包括返回)的规则在Go 规范中定义:Assignability。与您的情况相关的是:
V并且T具有相同的基础类型,并且 V 或 T 中至少有一个不是命名类型。
和基础类型:
如果 T 是预先声明的布尔值、数字或字符串类型之一,或者是文字类型,则对应的基础类型是 T 本身。
第一个示例编译是因为它是一个具有底层类型(本身)[]string的未命名类型文字,并且是一个具有底层类型(根据您的类型定义)的命名类型。[]stringdeck[]string
第二个示例无法编译,因为*[]string和*deck都是未命名的类型文字,它们本身是(不同的)基础类型。
要使第二个示例编译,您不能依赖直接赋值,但正如您发现的那样,使用显式类型转换
return (*deck)(&cards)
由于以下规则,此转换有效:
忽略 struct 标记(见下文),
x的类型 和T是未命名类型的指针类型,它们的指针基类型不是类型参数但具有相同的基础类型。
- 1 回答
- 0 关注
- 123 浏览
添加回答
举报
0/150
提交
取消
