可以在Go中使用数组吗?

时间:2017-09-22 05:20:20

标签: go

我正在学习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中的数组是否有方法?奇怪的东西。只有类可以有我的软件开发理解方法,在这里,我看到一个具有函数(方法)的数组。这段代码怎么了?

2 个答案:

答案 0 :(得分:5)

  

gspec变量创建为带有键的2个值的关联数组   '配置'和关键'难度' ,那很清楚。

目前尚不清楚。这是假的。 Genesisstructgspec是指向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

  

Composite literals

     

复合文字构造结构,数组,切片和的值   映射并在每次评估时创建新值。他们包括   文字的类型后跟一个大括号的元素列表。   每个元素可以可选地在相应的键之前。

     

获取复合文字的地址会生成指向a的指针   使用文字值初始化的唯一变量。

gspec := &Genesis{
    Config:     params.TestChainConfig,
    Difficulty: big.NewInt(1),
}

gspec是使用Go复合文字构建的。

  

Method declarations

     

方法是具有接收器的功能。方法声明绑定一个   标识符,方法名称,方法,并关联方法   使用接收器的基本类型。

     

接收器通过前面的额外参数部分指定   方法名称。该参数部分必须声明单个非可变参数   参数,接收器。其类型必须为T或* T形式   (可能使用括号)其中T是类型名称。表示的类型   由T称为接收器基类型;它不能是指针或   接口类型,它必须在与...相同的包中定义   方法

T或* T形式的类型(可能使用括号),其中T是类型名称。可能有方法;它不能是指针或接口类型。 Go数组类型可能有方法。 Go map(关联数组)类型可以有方法。 Go结构类型可能有方法。

Go没有课程。

参考文献:

The Go Programming Language Specification

答案 1 :(得分:3)

你的假设是错误的。 gspec不是关联数组,而是Genesis类型的对象。 Genesis类型可能是某种struct类型,具有各种属性和方法。

有关结构和方法的示例,您可以访问以下Go by Example页面: