我在Go中阅读到,类型别名需要显式转换,但是以下代码可以正常工作。怎么样?
package main
import (
"fmt"
)
type Coartl [][]rune
func (ptr *Coartl) PushFront(str []rune) {
*ptr = append([][]rune{str}, (*ptr)...)
}
func (ptr *Coartl) PushBack(str []rune) {
*ptr = append((*ptr), str)
}
func (s Coartl) String() string {
var ret string
for _, v := range s {
ret += string(v)
ret += string("\n")
}
return ret
}
func main() {
var coartl Coartl
var art [][]rune = [][]rune{
[]rune("Hai"),
[]rune("Hello"),
}
coartl = art // How this converted
coartl.PushBack([]rune("qwerty"))
fmt.Print(coartl)
}
输出:Hai
Hello
qwerty
Program exited.
编辑:但是,为什么下面的代码不起作用?
package main
import (
"fmt"
)
func main() {
type Int int
var i int = 1
var j Int = i // i is not convertable to j ?
fmt.Print(i, j)
}
Go playground
最佳答案
这不是type alias,而是类型定义。类型别名的形式为type Coartl = [][]rune
(请注意=
)。
您正在将Coartl
类型声明为具有基础类型[][]rune
。
执行分配coartl = art
时,请检查assignability。规格说明(显示了相关部分,其余部分请参见链接的规格):
值x可分配给类型T的变量(“x可分配给
T“)如果满足以下条件之一:
由于
Coartl
的基础类型也是[][]rune
,因此可以继续分配。
关于go - 如何在go中隐式转换类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63810758/