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

Go assignment involving pointers to custom types

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

以下代码有效:

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)
}

有关赋值的规则(包括returns)在Go specs: Assignability中定义。与您的案例相关的是:

V and T have identical underlying types and at least one of V or T is not a named type.

Underlying types

If T is one of the predeclared boolean, numeric, or string types, or a type literal, the corresponding underlying type is T itself.

第一个示例可以编译,因为 []string 是一个未命名的类型字面量,其底层类型为 []string(它本身),而 deck 是一个命名类型,其底层类型为 []string(根据你的类型定义)。

第二个示例无法编译,因为 *[]string*deck 都是未命名的类型文字,它们本身是(不同的)基础类型。

要编译第二个示例,您不能依赖直接赋值,但正如您发现的那样,可以使用显式类型转换

return (*deck)(&cards)

并且由于以下rule

,此转换有效

ignoring struct tags (see below), x's type and T are pointer types that are not named types, and their pointer base types are not type parameters but have identical underlying types.