1. 程式人生 > >Go程式設計之介面作結構體屬性

Go程式設計之介面作結構體屬性

最近在看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去呼叫一次那個介面函式。