Go:扩展未命名类型,如[]字符串

Go:扩展未命名类型,如[]字符串,go,Go,关于在Go中键入别名,我有点困惑 我读过这个相关的问题- 据我所知,如果底层结构相同,则未命名变量和命名变量可以相互赋值 我想弄明白的是,我可以通过命名来扩展未命名的类型吗?类似这样: type Stack []string func (s *Stack) Print() { for _, a := range s { fmt.Println(a) } } 这给了我一个错误不能覆盖s(type*Stack) 尝试将其强制转换为[]字符串,无法执行 我知道下面的

关于在Go中键入别名,我有点困惑

我读过这个相关的问题-

据我所知,如果底层结构相同,则未命名变量和命名变量可以相互赋值

我想弄明白的是,我可以通过命名来扩展未命名的类型吗?类似这样:

type Stack []string

func (s *Stack) Print() {
    for _, a := range s {
        fmt.Println(a)
    }
}
这给了我一个错误
不能覆盖s(type*Stack)

尝试将其强制转换为
[]字符串
,无法执行

我知道下面的代码是有效的——我应该这样做吗?如果是这样的话,我想知道为什么上面的方法不起作用,以及像
type Name[]string
这样的声明有什么用

type Stack struct {
    data []string
}

func (s *Stack) Print() {
    for _, a := range s.data {
        fmt.Println(a)
    }
}

您应该取消对指针s的引用

type Stack []string

func (s *Stack) Print() {
    for _, a := range *s {
        fmt.Println(a)
    }
}

您是否尝试过
for uu,a:=range*s
s
是指向
Stack
的指针,因此是指向
[]string
的指针,在Go中,您不能在指针上设置范围。一个
范围*s
就可以了。这与“命名”或“未命名”类型或别名无关,它只是静态键入的结果,并且您的s具有错误的范围设置类型。在Go中,没有类型别名。
type
关键字引入了新的命名类型。它们不是别名。(与其他各种语言相比,这是Go的重要优势之一)太棒了!这么简单。出于某种原因,我寻找复杂的解决方案。我想这是因为Go编译器把我惯坏了——它通常让我知道
*type
何时被用作
type
。非常感谢。Francesc Campoy(谷歌)做了一个很棒的演示,他总结了在哪些情况下可以使用*T或T,以及什么时候不同。从第38页开始。