2015-12-16 110 views
-2

(我從PHP來)在PHP我可以創建一個接口GoLang:創建接受的接口函數

interface Hello { 
    public function bar(); 
} 

和實現它

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

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

然後一些類,我還可以創建一個接受該接口的NewClass :: bar()方法。

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

我怎樣才能在Golang中做同樣的事情?

type humanPlayer struct { 
    name string 
} 

type botPlayer struct { 
    name string 
} 

我怎樣才能在golang中實現相同的模式?

+7

所有這一切在Go的Go to Go http://tour.golang.org/中都有很好的解釋,特別是「方法和接口」。我不建議您在此處複製粘貼旅遊信息或嚴重地改寫它,我建議您參加遊覽。 – Volker

+0

非常好的鏈接。謝謝。 – sensorario

回答

1
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) 
} 
+1

當然,這說明了如何去做,但怎麼解釋發生了什麼? 在你不去聲明一個結構體實現了一個接口的時候,你只是實現了接口:在這種情況下,Namer接口適用於任何實現了返回字符串的Name()函數的結構體。 – Guildencrantz

+0

女巫是聲明與'var human humanPlayer'和'human:=&humanPlayer {}'之間的區別嗎? – sensorario

+1

@sensorario前者聲明一個類型爲'humanPlayer'的變量。後者聲明''humanPlayer'類型之一併爲其分配'&humanPlayer {}'。 – rightfold