为了账号安全,请及时绑定邮箱和手机立即绑定

涉及指向自定义类型的指针的 Go 赋值

涉及指向自定义类型的指针的 Go 赋值

Go
呼如林 2022-11-28 14:52:57
我正在使用自定义类型,当涉及如下指针时,我遇到了问题。以下代码有效: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是未命名类型的指针类型,它们的指针基类型不是类型参数但具有相同的基础类型。


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号