web-dev-qa-db-fra.com

Erreur: struct Type n'est pas une expression

En utilisant struct et une fonction censée imprimer les éléments de la structure, j'ai écrit ce programme simple:

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

Quand je le lance, j'obtiens l'erreur go:16: type Salutation is not an expression. Qu'est-ce qui ne va pas ici?

Chose intéressante, lorsque je change la définition de s en var s = Salutation {"Alex", "Hi"} cela fonctionne très bien. Mais ce sont fondamentalement différentes manières syntaxiques de définir la même entité. C'est pourquoi je ne comprends pas la source de l'erreur. 

26
Morteza R

L'erreur est sur cette ligne

    var s = Salutation

La chose à la droite du = doit être évaluée à une valeur. Salutation est un type, pas une valeur. Voici trois façons de déclarer s:

 var s Salutation      // variable declaration using a type 

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

 s := Salutation{}     // short variable declaration

Le résultat des trois déclarations est identique. La troisième variante est généralement préférée à la seconde, mais ne peut pas être utilisée pour déclarer une variable au niveau du package.

Voir la spécification de langue pour tous les détails sur les déclarations de variable .

45
ThunderCat

4ème voie:

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

Je passe toujours les structures par référence, pas valeur ..__ Et toujours les primitives par valeur.

Votre méthode réécrite en tant que méthode de réception:

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

Exemple complet:

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