登录
首页 >  Golang >  Go问答

为什么 Golang 类型别名有时兼容有时不兼容?

来源:stackoverflow

时间:2024-04-21 18:33:35 278浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《为什么 Golang 类型别名有时兼容有时不兼容?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

下面的代码工作得很好:

type alias []byte

type data struct {
    x alias
}

func main() {
    s2 := []byte("s2")
    s1 := &data{
        x: s2,
    }
    var s4 alias = s2
    fmt.println(s1,s2, s4)
}

但以下内容无法编译

type alias string

type data struct {
    x alias
}

func main() {
    s2 := string("s2")
    s1 := &data{
        x: s2, // needs explicit alias(s2)
    }
    var s4 alias = s2 // needs explicit alias(s2)
    fmt.Println(s1,s2, s4)
}
}

唯一的区别是类型别名从字节切片更改为字符串。

这些类型之间有什么区别,一种是自动转换的,另一种不是?


解决方案


根据 Go 语言规范:

https://golang.org/ref/spec#Assignability

此特定条款:

x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中至少有一个不是定义的类型。

请注意,string 是已定义类型,而 []byte 是未定义类型。所以:

  • 您可以将 []byte 分配给 alias,因为它们具有相同的基础类型,并且 []byte 是未定义类型
  • 您无法将 string 分配给 alias,因为它们都是定义的类型。

以上就是《为什么 Golang 类型别名有时兼容有时不兼容?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>