2017-09-22 3 views
0

私は行くを学習し、このコードを見つけています:配列には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

"のみのクラスはメソッドを持つことができる" - ゴーは、クラスを持っていません。 – Flimzy

答えて

5

:あなたは、次のGo by Exampleページを訪問できた構造体及び方法の例については

'設定'とキー '難しさ'、それは明らかです。

明らかではありません。それは間違いです。 Genesisstructです。 gspecstructへのポインタです。 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

複合リテラルは、構造体、配列、スライス、および の値をマップし、評価するたびに新しい値を作成します。それらは、リテラルの型の と、要素の中括弧で囲まれたリストで構成されています。 各要素の前にオプションとして対応するキーを付けることができます。

複合リテラルのアドレスを取得すると、リテラルの値で初期化された 一意の変数へのポインタが生成されます。

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

gspecゴー複合リテラルを使用して構築されます。


Method declarations

方法は、受信機機能です。メソッド宣言は、識別子、メソッド名を のメソッドにバインドし、メソッド を受信者の基本タイプに関連付けます。

受信者は、 メソッド名の前に余分なパラメータセクションを指定して指定します。そのパラメータセクションは、受信者でない単一の可変パラメータ を宣言する必要があります。その型は、Tまたは* T の形式でなければならない(おそらくかっこを使用する).Tは型名である。 Tによって と表されるタイプは、受信機ベースタイプと呼ばれる。ポインタまたは インターフェイスタイプであってはならず、 メソッドと同じパッケージで定義する必要があります。

Tまたは* T(おそらく括弧を使用)の型.Tは型名です。メソッドを持つことができます。ポインタまたはインタフェース型であってはなりません。 Go配列型にはメソッドがあります。 Goマップ(連想配列)型にはメソッドがあります。 Go構造体の型にはメソッドがあります。

Goにはクラスがありません。


参考文献:

The Go Programming Language Specification

3

あなたの前提は間違っています。 gspecは連想配列ではなく、Genesisのオブジェクトです。 Genesisタイプはおそらく、さまざまな属性とメソッドを持つstructタイプの何らかのタイプです。 gspec変数は、キーと2つの値の連想配列として作成され

+2

@AdamSmith:あなたの例は、配列とは異なるスライスです。 [配列の種類](https://golang.org/ref/spec#Array_types)と[スライスの種類](https://golang.org/ref/spec#Slice_types)。 [The Go Programming Language Specification](https://golang.org/ref/spec)を参照してください。 – peterSO

+0

*すべての*型には、関数、さらには関数があります。はい、メソッドに対してメソッドを宣言できます。 –

+0

@MiloChristiansen: "**すべての**タイプにはメソッドがあります。" ** **タイプではありません。 "メソッド宣言"(https://golang.org/ref/spec#Method_declarations) – peterSO

関連する問題