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

我正在使用自定义类型,当涉及如下指针时,我遇到了问题。


以下代码有效:


package main


import (

    "fmt"

)


type deck []string


func newDeck(cards ...string) deck {

    return cards

}

下面的代码也是有效的:


package main


func str(n []string) *[]string {

return &n

}

以下代码无效。为什么这样?我必须写一个类型转换return (*deck)(&cards)


package main


import (

    "fmt"

)


type deck []string


func newDeck(cards ...string) *deck {

    return &cards // compiles with return (*deck)(&cards)

}


呼如林
浏览 124回答 1
1回答

Smart猫小萌

关于赋值(包括返回)的规则在Go 规范中定义:Assignability。与您的情况相关的是:V并且T具有相同的基础类型,并且 V 或 T 中至少有一个不是命名类型。和基础类型:如果 T 是预先声明的布尔值、数字或字符串类型之一,或者是文字类型,则对应的基础类型是 T 本身。第一个示例编译是因为它是一个具有底层类型(本身)[]string的未命名类型文字,并且是一个具有底层类型(根据您的类型定义)的命名类型。[]stringdeck[]string第二个示例无法编译,因为*[]string和*deck都是未命名的类型文字,它们本身是(不同的)基础类型。要使第二个示例编译,您不能依赖直接赋值,但正如您发现的那样,使用显式类型转换return (*deck)(&cards)由于以下规则,此转换有效:忽略 struct 标记(见下文),x的类型 和T是未命名类型的指针类型,它们的指针基类型不是类型参数但具有相同的基础类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go