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.
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 .
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();
}