2017-09-22 2 views
0

Ich lerne Go und fand diesen Code:Kann Array in Go Methoden haben?

// 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 
} 

Meine Frage ist:

gspec Variable wird als assoziatives Array von 2 Werten mit Schlüssel erstellt 'Config' und Schlüssel 'Schwierigkeit ', das ist klar.

Aber dann sehe ich diese Zeile:

gspec.MustCommit(db) 

und ich verstehe nicht, wo wurde die 'MustCommit()' Funktion deklariert? Hat ein Array in Go auch Methoden? Komisches Zeug. Nur Klasse kann Methoden in meinem Verständnis der Softwareentwicklung haben und hier sehe ich ein Array, das Funktionen (Methoden) hat. Was ist mit diesem Code los?

+0

"Nur Klassenmethoden haben können" - Go haben keine Klassen. – Flimzy

Antwort

5

gspec Variable wird als assoziatives Array von 2 Werten mit Schlüssel erstellt 'Config' und Taste 'Schwierigkeit', das ist klar.

Es ist nicht klar. Ist es falsch. Genesis ist ein struct. gspec ist ein Zeiger auf eine struct. A struct ist kein assoziatives Array. In Go ist ein map ein assoziatives Array.

Sie haben:

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

Wo

// 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

Zusammengesetzte Literale erstellen Werte für Strukturen, Arrays, Slices und Maps und erstellen bei jeder Auswertung einen neuen Wert. Sie bestehen aus vom Typ des Literals, gefolgt von einer klammergebundenen Liste von Elementen. Jedem Element kann optional ein entsprechender Schlüssel vorangestellt werden.

Die Adresse eines zusammengesetzten Literals ergibt einen Zeiger auf eine eindeutige Variable , die mit dem Wert des Literals initialisiert wird.

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

gspec wird mit einem Go-Verbund wörtlichen aufgebaut.


Method declarations

Ein Verfahren ist eine Funktion, mit einem Empfänger. Eine Methodendeklaration bindet einen Bezeichner, den Methodennamen, an eine Methode und ordnet die Methode dem Basistyp des Empfängers zu.

Der Empfänger wird über einen zusätzlichen Parameterabschnitt vor dem Methodennamen angegeben. Dieser Parameterabschnitt muss einen einzelnen nicht variablen Parameter , den Empfänger, deklarieren. Sein Typ muss die Form T oder * T haben (möglicherweise mit Klammern), wobei T ein Typname ist. Der von T mit bezeichnete Typ wird als Empfängerbasistyp bezeichnet; Es darf kein Zeiger oder Schnittstellentyp sein und muss im gleichen Paket wie die Methode definiert werden.

Ein Typ der Form T oder * T (möglicherweise mit Klammern), wobei T ein Typname ist. kann Methoden haben; Es darf kein Zeiger oder Schnittstellentyp sein. Ein Go-Array-Typ kann Methoden haben. Ein Go-Map-Typ (assoziatives Array) kann Methoden enthalten. Ein Go-Strukturtyp kann Methoden haben.

Go hat keine Klassen.


Referenzen:

The Go Programming Language Specification

3

Ihre Annahme ist falsch. gspec ist kein assoziatives Array, sondern ein Objekt vom Typ Genesis. Der Genesis Typ ist wahrscheinlich eine Art struct -Typ mit verschiedenen Attributen und Methoden.

Beispiele auf structs und Methoden könnten Sie besuchen die folgenden Go by Example Seiten:

+2

@AdamSmith: Ihr Beispiel ist eine Scheibe, die sich von einem Array unterscheidet. [Array-Typen] (https://golang.org/ref/spec#Array_types) und [Slice-Typen] (https://golang.org/ref/spec#Slice_types). Siehe [Die Go-Programmiersprachenspezifikation] (https://golang.org/ref/spec). – peterSO

+0

* Jeder * Typ kann Methoden in gehen, sogar Funktionen. Ja, Sie können eine Methode für eine Methode deklarieren. –

+0

@MiloChristiansen: "** Jeder ** Typ kann Methoden in gehen haben." Nicht ** jeder ** Typ. "Es darf kein Zeiger oder Schnittstellentyp sein und muss im selben Paket wie die Methode definiert sein. [Methodendeklarationen] (https://golang.org/ref/spec#Method_declarations) – peterSO

Verwandte Themen