GoLang:创建一个接受接口的函数(我来自PHP)

huangapple go评论91阅读模式
英文:

GoLang: create a function that accept an interface (I came from PHP)

问题

在Go语言中,可以使用接口(interface)来实现相同的模式。下面是一个示例:

package main

import "fmt"

type Hello interface {
	bar()
}

type Foo struct{}

func (f Foo) bar() {
	// do something
	fmt.Println("Foo bar")
}

type Bar struct{}

func (b Bar) bar() {
	// do something
	fmt.Println("Bar bar")
}

type NewClass struct{}

func (nc NewClass) bar(h Hello) {
	// do something
	h.bar()
}

func main() {
	f := Foo{}
	b := Bar{}
	nc := NewClass{}

	nc.bar(f) // 输出:Foo bar
	nc.bar(b) // 输出:Bar bar
}

在上面的示例中,我们定义了一个Hello接口,并在FooBar结构体中实现了bar方法。然后,我们创建了一个NewClass结构体,并在其中定义了一个bar方法,该方法接受一个实现了Hello接口的参数。最后,在main函数中,我们创建了FooBar的实例,并通过NewClassbar方法调用了它们的bar方法。

希望这可以帮助到你!

英文:

In PHP I can create an interface

interface Hello {
    public function bar();
}

And some classes that implements it

final class Foo implements Hello {
    public function bar() {
        // do something
    }
}

final class Bar implements Hello {
    public function bar() {
        // do something
    }
}

Then, I can also create a NewClass::bar() method that accept the interface.

final class NewClass {
    public function bar(Hello $hello) {
        // do something
    }
}

How can I do the same, in Golang?

type humanPlayer struct {
    name string
}

type botPlayer struct {
    name string
}

How can I realize same pattern in golang?

答案1

得分: 1

包 main

import (
"fmt"
)

type Namer interface {
Name() string
}

type humanPlayer struct {
name string
}

func (h *humanPlayer) Name() string {
return h.name
}

type botPlayer struct {
name string
}

func (b *botPlayer) Name() string {
return b.name
}

func sayName(n Namer) {
fmt.Printf("你好 %s\n", n.Name())
}

func main() {
human := &humanPlayer{
name: "鲍勃",
}
bot := &botPlayer{
name: "汤姆",
}
sayName(human)
sayName(bot)
}

英文:
package main

import (
	"fmt"
)

type Namer interface {
	Name() string
}

type humanPlayer struct {
	name string
}

func (h *humanPlayer) Name() string {
	return h.name
}

type botPlayer struct {
	name string
}

func (b *botPlayer) Name() string {
	return b.name
}

func sayName(n Namer) {
	fmt.Printf("Hello %s\n", n.Name())
}

func main() {
	human := &humanPlayer{
		name: "bob",
	}
	bot := &botPlayer{
		name: "tom",
	}
	sayName(human)
	sayName(bot)
}

huangapple
  • 本文由 发表于 2015年12月16日 08:22:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/34301929.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定