• jason-台北
    2019-04-05
    interface,不只是能傳指針類型的實例,而是看您的實例有沒有實踐interface 的方法。
    
     2
  • SeeaYouL
    2019-07-30
    package polymorphism

    import (
        "fmt"
        "testing"
    )

    type Code string
    type Programmer interface {
        WriteHelloWorld() Code
    }

    type GoProgrammer struct {
    }

    func (g GoProgrammer) WriteHelloWorld() Code {
        return "fmt.Println(\"Hello World!\")"
    }

    type JavaProgrammer struct {
    }

    func (j JavaProgrammer) WriteHelloWorld() Code {
        return "System.out.Println(\"Hello World!\")"
    }

    func WriteFirstProgrammer(p Programmer) {
        fmt.Printf("%T %v\n", p, p.WriteHelloWorld())
    }

    func TestPolymorphism(t *testing.T) {
        goProg := GoProgrammer{}
        // goProg := new(GoProgrammer)
        javaProg := new(JavaProgrammer)
        WriteFirstProgrammer(goProg)
        WriteFirstProgrammer(javaProg)
    }
    老师,为什么我这样写的输出结果没有报错?
    输出如下:
    === RUN TestPolymorphism
    polymorphism.GoProgrammer fmt.Println("Hello World!")
    *polymorphism.JavaProgrammer System.out.Println("Hello World!")
    --- PASS: TestPolymorphism (0.00s)
    PASS
    coverage: 0.0% of statements
    ok     _/E_/go_learning/src/ch12/polymorphic    0.233s

    Done
    展开

    作者回复: 这是因为在Go Spec中有这样的定义 “The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T).“ 即指针类型可以访问定义在指针类型和值类型上的所有方法。可以参考这篇文章:https://suraj.io/post/golang-methods-interfaces/

     1
     1
  • 思维
    2020-01-11
    type Code string//类型定义 type Code=string //类型别名
    
    
  • 一根想薅羊毛的韭菜
    2019-11-26
    老师,你好,多态是polymorphism 不是 polymorphsim

    作者回复: 非常感谢🙏指出

    
    
  • Geek_338030
    2019-08-16
    看了留言里说的那样改法后就可以将实例传入到WriteProgram()里了,那请问课中所说的interface类型只能传入指针类型还成立吗

    作者回复: 嗯,只要是在结构上实现了interface的方法,则可以传入结构实例指针类型或者结构的实例。
    如果方法是在结构的指针上实现的,则只能传入结构实例的指针。

    
    
  • snowball
    2019-07-21
    老师,switch这里case的值不是v的值,是表达式的嘛 还是.(type)的特殊写法呢

    作者回复: 这里你可以简单的看作是GO的特殊写法。

     1
    
  • 行走的BUG君
    2019-06-12
    goPro := new(GoProgrammer)
    javaPro := new(JavaProgrammer)
    WriteFirstProgram(goPro)
    WriteFirstProgram(javaPro)

    func WriteFirstProgram(p Programmer) {
        fmt.Printf("%T %v\n", p, p.WriteHelloWord())
    }

    调用 WriteFirstProgram 传值的时候 会不会涉及到子类向父类的类型转换?
    展开
    
    
  • Geek_f99568
    2019-05-24
    老师,我也想知道荣同学这段代码的理解。
    
    
  • reven404
    2019-03-21
    go语言不支持继承,但支持多态。

    下叙代码片段暑促结果怎么理解比较恰当,两次"%T"输出的类型不一致。

    type FileAttrs interface {
        getPath() string
    }

    type File struct {
        Name string
    }
    type BlobFile struct {
        File
    }

    type TextFile struct {
        File
    }

    func (file *File) getPath() string {

        return fmt.Sprintf("%s/%T", file.Name, file)
    }

    func printFileAttrs(file FileAttrs) {
        fmt.Printf("file name: %s ? %T\n", file.getPath(), file)
    }

    func TestFile(t *testing.T) {

        file := &File{Name: "0"}
        bf := &BlobFile{File{Name: "1"}}
        tf := &TextFile{File{Name: "2"}}
        printFileAttrs(file)
        printFileAttrs(bf)
        printFileAttrs(tf)
    }
    展开
     1
    
  • .Alter
    2019-03-18
    老师您好,请问为何我写两段式的switch语句会报错呢?
    switch v := p.(type) ; v {
      // code
    }

    会报:use of .(type) outside type switch
    .(type)是只可以用在switch语句中吗?

    还有就是,这里面的v的返回结果是什么呢?可以用case判断类型,但打印出的是value值
    展开

    作者回复: 这个为什么要用两段式呢,对于这个情况v后面的v有什么用呢?前面v已经被赋值并且可以在下面使用了。v的值是类型,你可以通过%T来输出

    
    
  • t7ink
    2019-03-17
    既然是duck type类型,如果一个结构没有实现全部接口,那go编译器只会认为它是什么?

    作者回复: 那就我当做那个接口的实现使用。所以,Go更提倡小接口(单个方法)大的接口有小接口组成

    
    
我们在线,来聊聊吧