Go程式設計之介面作結構體屬性
阿新 • • 發佈:2019-02-18
最近在看Ethereum原始碼,發現在它的BlockChain結構體裡面有屬性直接是介面,它有個set函式,用於設定介面的,傳的值為實現這個介面的一個結構體。下面自己試著寫了一個小demo:
package main import ( "fmt" ) type A interface { NameGet() string } type B struct { i int a A } func NewB(a A) *B { nb := &B{i: 2} nb.SetA(a) return nb } func (b *B) SetA(a A) { b.a = a } type C struct { name string } func NewC() *C { c := &C{"chen"} return c } func (c *C) NameGet() string { return c.name } func main() { b := NewB(NewC()) fmt.Println(b.a.NameGet()) }
A是一個介面,B是一個結構體,有個A介面屬性,它有個方法用於設定A介面,在NewB裡面呼叫,C是一個實現了A裡面介面的結構體,把它的物件傳給NewB做引數。這樣我們可以呼叫b.a.NameGet()方法。這裡面,我們可以把這個介面函式作為一個服務程式,開個協程,可以實時或者定時呼叫。以太坊裡面應該就是這個原理,應該是5s去呼叫一次那個介面函式。