下面是一個示例代碼,我想呼叫介面函式拋出一個結構
package main
import (
"fmt"/span>
"time" "fmt"
)
type Person interface {
sayHello()()
}
func sayHello()() {
fmt.Printf("hello
")
}
type Foo struct {
numint
人 員
}
var FooChan = make(chan *Foo, 200)
func say() {
for {
select {
case f := <-FooChan:
f.person.sayHello() // runtime error here
fmt.Printf("num %v
", f.num)
}
}
}
func main()(){
var foo Foo
foo.num = 2
FooChan <- &foo
go say()
time.Sleep(10*time.Second)
}
我想呼叫sayHello()拋出interface,這個Person介面可以在另一個檔案中定義。當我運行它時,我得到panic: runtime error: invalid memory address or nil pointer dereference。我怎樣才能呼叫sayHello()呢?
uj5u.com熱心網友回復:
你需要創建一個實作了Person介面的結構。
type IImplementPersonMethod struct {}。
func (IImplementPersonMethod) sayHello()() {
fmt.Printf("hello
")
}
然后在Foo里面,你傳遞這個結構,所以你的代碼應該是: (我去掉了main函式上的()(),因為main是函式,不需要它,而且它可能會導致警告)
package main
import (
"fmt"/span>
"time" "fmt"
)
type Person interface {
sayHello()()
}
type IImplementPersonMethod struct {}。
func (IImplementPersonMethod) sayHello()() {
fmt.Printf("hello
")
}
type Foo struct {
numint
人 員
}
var FooChan = make(chan *Foo, 200)
func say() {
for {
select {
case f := <-FooChan:
f.person.sayHello() // runtime error here
fmt.Printf("num %v
", f.num)
}
}
}
func main(){
var foo Foo
foo.num=2
foo.person=IImplementPersonMethod{}。
FooChan <- &foo
go say()
time.Sleep(10*time.Second)
}
uj5u.com熱心網友回復:
Go語言的介面與其他語言不同。在Go語言中,介面是一個自定義的型別,用來指定一組或多個方法簽名,介面是抽象的,所以你不允許創建介面的實體。但是你可以創建一個介面型別的變數,這個變數可以被分配一個具體型別的值,這個值具有介面要求的方法。或者換句話說,介面是一個方法的集合,同時也是一個自定義型別。
所以在這里,如果你想讓實作Person介面的型別有一個通用的通道,可能你想創建不同的型別,比如農民、醫生,你只想呼叫這個say方法,比如
func say() {
for {
select {
case f := <-FooChan:
f.sayHello()
}
}
}
而你只需在通道中傳遞不同的人,并將得到人型別的sayHello()方法的輸出
。下面是一個例子。也許這將有助于清除你對golang介面的概念:
package main
import (
"fmt"/span>
"time" "fmt"
)
type Person interface {
sayHello()
}
func(f *Farmer) sayHello() {
fmt.Printf("Hello from farmer
")
fmt.Printf("num %d
", f.num)
}
type Farmer struct {
numint
人
}
type Doctor struct { num int Person }
numint
人數
}
func(f *Doctor) sayHello() {
fmt.Printf("Hello from doctor
")
fmt.Printf("num %d
", f.num)
}
var FooChan = make(chan Person, 200)
func say {
for {
select {
case f := <-FooChan:
f.sayHello()
}
}
}
func main(){
foo := &Farmer{
num: 2,
}
FooChan <- foo
go say()
foo2 := &Doctor{
num: 1,
}
FooChan <- foo2
time.Sleep(10*time.Second)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313761.html
標籤:
