【发布时间】:2014-12-08 22:23:17
【问题描述】:
我对 Go 中的类型别名有点困惑。
我已经阅读了这个相关的 SO 问题 - Why can I type alias functions and use them without casting?。
据我了解,如果底层结构相同,未命名变量和命名变量可以相互分配。
我想弄清楚的是,我可以通过命名来扩展未命名的类型吗?如下所示:
type Stack []string
func (s *Stack) Print() {
for _, a := range s {
fmt.Println(a)
}
}
这给了我错误cannot range over s (type *Stack)
尝试将其投射到 []string,不行。
我知道下面的代码有效 - 我应该这样做吗?如果是这样,我很想知道为什么上述方法不起作用,以及 type Name []string 等声明的用途是什么。
type Stack struct {
data []string
}
func (s *Stack) Print() {
for _, a := range s.data {
fmt.Println(a)
}
}
【问题讨论】:
-
你试过
for _, a := range *s吗? -
s是一个指向Stack的指针,因此是一个指向[]string的指针,在 Go 中你不能在指针上进行范围。range *s可以。这与“命名”或“未命名”类型或别名无关,它只是静态类型的结果,并且您的 s 具有错误的范围类型。 -
在 Go 中,没有类型别名之类的东西。
type关键字引入了新的命名类型。它们不是别名。 (与其他各种语言相比,这是 Go 的重要优势之一)
标签: go