it-swarm.com.de

Fehler: struct Type ist kein Ausdruck

Mit struct und einer Funktion, die die Elemente der Struktur ausdrucken soll, habe ich dieses einfache Programm geschrieben:

package main

import "fmt"

type Salutation struct {
    name     string
    greeting string
}

func Greet(salutation Salutation) {
    fmt.Println(salutation.name)
    fmt.Println(salutation.greeting)
}

func main() {
    var s = Salutation
    s.name = "Alex"
    s.greeting = "Hi"
    Greet(s)
}

Beim Ausführen erhalte ich die Fehlermeldung go:16: type Salutation is not an expression. Was geht hier schief?

Interessanterweise funktioniert die Änderung von s in var s = Salutation {"Alex", "Hi"} einwandfrei. Es gibt jedoch grundsätzlich verschiedene syntaktische Möglichkeiten, dieselbe Entität zu definieren. Deshalb verstehe ich die Fehlerquelle nicht. 

26
Morteza R

Der Fehler befindet sich in dieser Zeile

    var s = Salutation

Die Sache rechts von = muss einen Wert ergeben. Salutation ist Typ, nicht Wert. Hier gibt es drei Möglichkeiten, s zu deklarieren:

 var s Salutation      // variable declaration using a type 

 var s = Salutation{}  // variable declaration using a value

 s := Salutation{}     // short variable declaration

Das Ergebnis aller drei Erklärungen ist identisch. Die dritte Variante wird normalerweise der zweiten vorgezogen, kann jedoch nicht zur Deklaration einer Variablen auf Paketebene verwendet werden.

In der Sprachspezifikation finden Sie alle Details zu Variablendeklarationen .

45
ThunderCat

4. Weg:

var s * Anrede = & (Anrede {});

Ich übergebe immer Strukturen nach Verweis, nicht nach Wert ..__ und Primitive immer nach Wert.

Ihre Methode wurde als Empfängermethode neu geschrieben:

func (s *Salutation) Greet()() {
    fmt.Println(s.name)
    fmt.Println(s.greeting)
}

Vollständiges Beispiel:

package main

import "fmt"

func NewSalutation()(*Salutation){
    return &( Salutation{} );
}
type Salutation struct {
    name     string
    greeting string
}

func (s *Salutation) Greet()() {
    fmt.Println(s.name)
    fmt.Println(s.greeting)
}

func main() {
    var s *Salutation;   //:<--Null
    s = NewSalutation()  //:<--Points To Instance
    s.name     = "Alex"
    s.greeting = "Hi"
    s.Greet();
}
1
J.M.I. MADISON