go - 如何在go中隐式转换类型别名?

标签 go

我在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“)如果满足以下条件之一:

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

  • 由于Coartl的基础类型也是[][]rune,因此可以继续分配。

    关于go - 如何在go中隐式转换类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63810758/

    相关文章:

    templates - 防止模板中转义正斜杠

    html - Golang 创建主布局网页

    windows - Windows 10 上的 Ansi 颜色,有点不工作

    mysql - 如何为 Golang 格式化 MySql CREATE USER 语句

    Golang模板顺序

    go - gin-gonic 是否并行处理请求?

    异步消息golang

    go - 无法理解一些 Go 代码

    PHP 创建 ECDSA 签名并使用 Golang 验证

    testing - 如何在我的项目中的所有测试文件上运行 go test, vendor 包除外