gpt4 book ai didi

go - 将一段字符串转换为一段自定义类型

转载 作者:IT王子 更新时间:2023-10-29 01:22:39 24 4
gpt4 key购买 nike

我是 Go 的新手,所以这可能是显而易见的。编译器不允许以下代码:( http://play.golang.org/p/3sTLguUG3l )

package main

import "fmt"

type Card string
type Hand []Card

func NewHand(cards []Card) Hand {
hand := Hand(cards)
return hand
}

func main() {
value := []string{"a", "b", "c"}
firstHand := NewHand(value)
fmt.Println(firstHand)
}

错误是:/tmp/sandbox089372356/main.go:15: 不能在 NewHand 的参数中使用值(类型 []string)作为类型 []Card

从规范来看,[]string 与[]Card 的底层类型不同,因此无法进行类型转换。

确实是这样,还是我漏掉了什么?

如果是这样,为什么会这样?假设,在一个非 pet 示例程序中,我输入了一段字符串,是否有任何方法可以将它“转换”成一片 Card,或者我是否必须创建一个新结构并将数据复制到其中? (我想避免这种情况,因为我需要调用的函数会修改 slice 内容)。

最佳答案

没有技术原因禁止元素具有相同底层类型(例如 []string[]Card)的 slice 之间的转换。这是一项规范决定,旨在帮助避免偶然具有相同结构的不相关类型之间的意外转换。

安全的解决方案是复制 slice 。但是,可以使用 unsafe 直接转换(无需复制)包裹:

value := []string{"a", "b", "c"}
// convert &value (type *[]string) to *[]Card via unsafe.Pointer, then deref
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)

https://play.golang.org/p/tto57DERjYa

包文档中的强制性警告:

unsafe.Pointer allows a program to defeat the type system and read and write arbitrary memory. It should be used with extreme care.

有一个discussion on the mailing list关于 2011 年的转换和基础类型,以及 proposal to allow conversion between recursively equivalent types 2016 年被拒绝,“直到有更令人信服的理由”。

关于go - 将一段字符串转换为一段自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29031353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com