我正在学习Go并找到了这段代码:
// newTestBlockChain creates a blockchain without validation.
func newTestBlockChain(fake bool) *BlockChain {
db, _ := ethdb.NewMemDatabase()
gspec := &Genesis{
Config: params.TestChainConfig,
Difficulty: big.NewInt(1),
}
gspec.MustCommit(db)
engine := ethash.NewFullFaker()
if !fake {
engine = ethash.NewTester()
}
blockchain, err := NewBlockChain(db, gspec.Config, engine, vm.Config{})
if err != nil {
panic(err)
}
blockchain.SetValidator(bproc{})
return blockchain
}
我的问题是:
gspec
变量创建为2个值的关联数组,其中键为“配置”,键为“难度”,这很明显。
然后我看到这一行:
gspec.MustCommit(db)
我不明白,' MustCommit()'函数在哪里声明了?另外,Go中的数组是否有方法?奇怪的东西。只有类可以有我的软件开发理解方法,在这里,我看到一个具有函数(方法)的数组。这段代码怎么了?
答案 0 :(得分:5)
gspec变量创建为带有键的2个值的关联数组 '配置'和关键'难度' ,那很清楚。
目前尚不清楚。这是假的。 Genesis
是struct
。 gspec
是指向struct
的指针。 struct
不是关联数组。在Go中,map
是一个关联数组。
你有:
gspec := &Genesis{
Config: params.TestChainConfig,
Difficulty: big.NewInt(1),
}
其中
// Genesis specifies the header fields, state of a genesis block. It also defines hard
// fork switch-over blocks through the chain configuration.
type Genesis struct {
Config *params.ChainConfig `json:"config"`
Nonce uint64 `json:"nonce"`
Timestamp uint64 `json:"timestamp"`
ExtraData []byte `json:"extraData"`
GasLimit uint64 `json:"gasLimit" gencodec:"required"`
Difficulty *big.Int `json:"difficulty" gencodec:"required"`
Mixhash common.Hash `json:"mixHash"`
Coinbase common.Address `json:"coinbase"`
Alloc GenesisAlloc `json:"alloc" gencodec:"required"`
// These fields are used for consensus tests. Please don't use them
// in actual genesis blocks.
Number uint64 `json:"number"`
GasUsed uint64 `json:"gasUsed"`
ParentHash common.Hash `json:"parentHash"`
}
https://godoc.org/github.com/ethereum/go-ethereum/core#Genesis
复合文字构造结构,数组,切片和的值 映射并在每次评估时创建新值。他们包括 文字的类型后跟一个大括号的元素列表。 每个元素可以可选地在相应的键之前。
获取复合文字的地址会生成指向a的指针 使用文字值初始化的唯一变量。
gspec := &Genesis{
Config: params.TestChainConfig,
Difficulty: big.NewInt(1),
}
gspec
是使用Go复合文字构建的。
方法是具有接收器的功能。方法声明绑定一个 标识符,方法名称,方法,并关联方法 使用接收器的基本类型。
接收器通过前面的额外参数部分指定 方法名称。该参数部分必须声明单个非可变参数 参数,接收器。其类型必须为T或* T形式 (可能使用括号)其中T是类型名称。表示的类型 由T称为接收器基类型;它不能是指针或 接口类型,它必须在与...相同的包中定义 方法
T或* T形式的类型(可能使用括号),其中T是类型名称。可能有方法;它不能是指针或接口类型。 Go数组类型可能有方法。 Go map(关联数组)类型可以有方法。 Go结构类型可能有方法。
Go没有课程。
参考文献:
答案 1 :(得分:3)
你的假设是错误的。 gspec
不是关联数组,而是Genesis
类型的对象。 Genesis
类型可能是某种struct
类型,具有各种属性和方法。
有关结构和方法的示例,您可以访问以下Go by Example页面: