golang 中的 method的方法和interface的方法有啥区别?

 type Person struct {
    name string
}

type Human interface {
    run()
}

type Student struct {
    name string
}

func (p Person) run() {
    fmt.Printf("%s is runing\n", p.name)
}

func (s Student) run() {
    fmt.Printf("%s is runing\n", s.name)
}
func test() {
    p := Person{name: "person"}
    s := Student{name: "student"}
    var human Human
    human = Human(s)
    human.run()
    p.run()
}

func main() {
    test()
}

就像如上,我都有run()方法,实现的同样的功能,这
代码会不会是多余的?

结构体:person 和student可以看作类,然后他们的run方法实现了interface里的run。

interface可以将两个结构体作为一个类型处理。如下例子:


 func test() {
    p := Person{name: "person"}
    s := Student{name: "student"}
    var human []Human
    human = append(human, p, s)
    for _, v := range human {
        v.run()
    }
}

Go中虽没有class,但依旧有method
通过显示说明receiver来实现与某个类型的结合
只能为同一个包中的类型定义方法
receiver可以是类型的值或者指针
不存在方法重载
可以使用值或指针来调用方法,编译器会自动完成转换
从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数(Method Value vs. Method Expression)
如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
类型别名不会拥有底层类型所附带的方法
方法可以调用结构中的非公开字段

有点多余,你的代码里Student 和 Person 都实现了 Human这个接口。

    var human Human
    human = Human(s)
    human.run()

这段代码可以用这句话直接替代

    s.run()