我使用的是自定义类型,当涉及指针时,我有一个问题,如下所示.

以下代码有效:

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

推荐答案

关于分配(包括退货)的规则在Go specs: Assignability中定义.与您的 case 相关的是:

VT具有相同的底层类型,并且V或T中至少有一个不是命名类型.

Underlying types:

如果T是预先声明的布尔型、数值型或字符串类型or a type literal之一,则相应的基础类型是T本身.

第一个示例之所以编译,是因为[]string是一个未命名的类型文字,其基础类型为[]string(本身),而deck是一个命名类型,其基础类型为[]string(根据您的类型定义).

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

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

return (*deck)(&cards)

由于以下rule个原因,此转换有效:

忽略 struct 标记(见下文),x的类型和T是指针类型,它们不是命名类型,它们的指针基类型不是类型参数,但具有相同的基础类型.

Go相关问答推荐

由于索引器压缩比限制,扫描包含golang包的图像时,伪影XRAY失败

如何使用中间件更改http请求的响应代码?

Golang内置打印(Ln)函数&S行为怪异

Golang:访问any类型泛型上的字段

如何在 Go 中将 int 转换为包含 complex128 的泛型类型?

Golang:如何在不转义每个动作的情况下呈现模板的模板?

GoLang: gocui 边框 colored颜色

Golang代码判断第一个词是否可以从第二个词形成

如何在 Docker 容器中使用私有存储库进行身份验证

在我的情况下,如何以正确的方式测试方法?

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

此代码如何生成内存对齐切片?

为什么 0 big.Int 的 .Bytes() 值是空切片?

使用无服务器工作流 go sdk 时出现间歇性 JSON 解组错误

curl:(56)Recv失败:连接由golang中的对等方与docker重置

K8s 算子读取原始数据

Go:为一组单个结果实现 ManyDecode

如何使用通用字段初始化匿名struct数组

AWS EKS 上的 Golang REST API 部署因 CrashLoopBackOff 而失败

有没有一种方法可以确保传递的值具有使用泛型的某些字段?