涉及指向自定义类型的指针的 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.
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.
我正在使用自定义类型,当涉及如下指针时我遇到了问题。
以下代码有效:
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
andT
have identical underlying types and at least one of V or T is not a named type.
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 andT
are pointer types that are not named types, and their pointer base types are not type parameters but have identical underlying types.