• 技术文章 >后端开发 >Golang

    解析Go中的多态 -无需interfaces

    藏色散人藏色散人2020-12-10 13:50:07转载823

    下面由golang教程栏目给大家介绍Go中的多态 -无需interfaces,希望对需要的朋友有所帮助!

    Go

    如果你想在Go中使用多态,但是不喜欢接口吗?请继续阅读...

    首先,让我们看看我们想做什么:

    var dog, duck *Animal
    
    dog = NewDog("fido")
    duck = NewDuck("donald")
    
    fmt.Println(dog.makeNoise())
    // fido says woof!
    fmt.Println(duck.makeNoise())
    // donald says quack!

    dogduck具有相同的类型(*Animal)。每个变量都使用不同的构造函数实例化,并且在makeNoise调用相同方法时它们具有不同的行为 。

    通常,这个例子是我们使用接口的目的,但我们不希望实际使用是这么简单。

    让我们看看如何使这项工作:

    请点击这里(https://play.golang.org/p/P5Ovn_K-yyo)查看完整的代码

    type Animal struct {
        makeNoiseFn func(*Animal) string
        name        string
        legs        int
    }

    Animal结构体包含namelegs属性,以及一个mkeNoiseFn属性,这个属性实际上是一个函数,函数接受一个*Animal参数并返回一个字符串。

    func (a *Animal) makeNoise() string {
        return a.makeNoiseFn(a)
    }

    makeNoise方法实际上只是一个包装器,该包装器调用相应的动物makenoiseFn,并将指向动物本身的指针作为其参数。

    func NewDog(name string) *Animal {
        return &Animal{
            makeNoiseFn: func(a *Animal) string {
                return a.name + " says woof!"
            },
            legs: 4,
            name: name,
        }
    }
    
    func NewDuck(name string) *Animal {
        return &Animal{
            makeNoiseFn: func(a *Animal) string {
                return a.name + " says quack!"
            },
            legs: 4,
            name: name,
        }
    }

    现在,我们要做的就是让同一个类型表现出不同的行为,并为其makeNoiseFn属性分配不同的功能 。现在,该makeNoise方法根据动物是dog还是duck而调用对应的函数。

    我应该这样做吗?

    不!

    这篇文章旨在向您展示您 可以 做什么,而不是 应该 做什么 。如果你需要实现多态,接口是一种更好的方法。如果使用接口,则此代码如下所示:

    type Animal interface {
        makeNoise() string
    }
    
    type Dog struct {
        name string
        legs int
    }
    
    func (d *Dog) makeNoise() string {
        return d.name + " says woof!"
    }
    
    type Duck struct {
        name string
        legs int
    }
    
    func (d *Duck) makeNoise() string {
        return d.name + " says quack!"
    }
    
    func NewDog(name string) Animal {
        return &Dog{
            legs: 4,
            name: name,
        }
    }
    
    func NewDuck(name string) Animal {
        return &Duck{
            legs: 4,
            name: name,
        }
    }
    
    func main() {
        var dog, duck Animal
    
        dog = NewDog("fido")
        duck = NewDuck("donald")
    
        fmt.Println(dog.makeNoise())
        // fido says woof!
        fmt.Println(duck.makeNoise())
        // donald says quack!
    }

    原文地址:https://www.sohamkamani.com/golang/2019-03-29-polymorphism-without-interfaces/

    译文地址:https://learnku.com/go/t/52404

    以上就是解析Go中的多态 -无需interfaces的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐: go golang
    上一篇:go语言有什么特点? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 详解Golang数组的传递• 对MongoDB的认识及操作• 如何使用golang的pprof包对程序进行性能分析• 你知道go程序的基本要素吗• 用Go实现进制之间的转化
    1/1

    PHP中文网