【问题标题】:confusion in understanding type conversions in go理解 Go 中的类型转换的困惑
【发布时间】:2019-03-01 01:50:52
【问题描述】:
    package main

    import (
    "fmt"
    )

    type val []byte

   func main() {
    var a []byte = []byte{0x01,0x02}
    var b val = a
    fmt.Println(a)
    fmt.Println(b)
}

o/p: [1 2] [1 2]

在这里,我的理解是 a,b 标识符共享相同的底层类型([]byte)。所以我们可以交换 b/w 2 个变量的值。

package main

import (
    "fmt"
)

type abc string

func main() {
    fm := fmt.Println
    var second = "whowww"
    var third abc = second //compile Error at this line 12
    fm(second)
    fm(third)

}

在第 12 行中,我无法分配变量。 可以通过使用显式转换 T(x) 来消除此错误,我想了解为什么我们不能进行隐式转换 由于两个变量共享相同的底层类型,但我无法分配它。

有人能解释一下这些背后的原因吗?

如果可能的话,请为我提供关于变量、结构类型、函数参数之间类型转换的良好文档。

【问题讨论】:

  • 在这个例子中你没有任何类型转换。 "Assignability"下你想要的文档
  • 语言规范是这里的权威文档。与大多数其他语言规范相反,它非常易读。
  • 您可以分配它,但它需要显式转换:var third abc = abc(second)play.golang.org/p/1_oMLVy-2lI
  • @TravisHegner 我们可以使用显式转换 T(x) 来转换类型。你能详细说明为什么我们不能进行隐式转换吗?

标签: go


【解决方案1】:

这是设计使然。 Go 编程语言需要不同类型之间的赋值才能进行显式转换。

看起来您只是简单地将字符串类型别名为具有不同的名称,但从技术上讲,您是在创建一个新类型,存储类型为字符串,但存在细微差别。

在 Go (as of 1.9) 中定义别名的方式略有不同,有一个等号。

type abc = string

如果对为什么 Go 没有隐式转换有任何困惑,当您只处理底层字符串类型时,这可能看起来很愚蠢,但对于更复杂的类型,它确保程序员只需查看发生转换的代码。

它在调试应用程序时特别有用,特别是在数字类型之间进行转换以了解何时发生转换时,因此如果有位截断,即uint64uint32,很明显可以看到在哪里这正在发生。

https://tour.golang.org/basics/13

【讨论】:

  • 我原来的问题是,为什么我们不能在第二个例子中进行隐式转换而我们在第一个例子中做同样的事情。
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多