首页 > 后端开发 > Golang > 为什么Go中不同类型的切片之间不能直接转换?

为什么Go中不同类型的切片之间不能直接转换?

Linda Hamilton
发布: 2024-12-03 14:36:12
原创
768 人浏览过

Why Can't I Directly Convert Between Slices of Different Types in Go?

Go 中的类型转换限制

Go 强制执行严格的类型规则,这可以防止包含相同底层的不同类型切片之间看似明显的转换元素。此限制在以下代码中很明显:

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)
}
登录后复制

尽管 []string 和 []Card 之间很相似,但编译器会报告错误:

cannot use value (type []string) as type []Card in argument to NewHand
登录后复制

基本原理

Go 规范禁止这种转换,以防止同时共享的不相关类型之间发生意外的类型转换

解决方案

  • 安全复制:推荐的做法是将切片的内容复制到所需的类型.
  • 不安全指针转换(Unsafe):该技术绕过类型系统,允许使用不安全包直接转换,但应谨慎使用。
value := []string{"a", "b", "c"}
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)
登录后复制

以上是为什么Go中不同类型的切片之间不能直接转换?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板