web-dev-qa-db-ja.com

エラー:構造体タイプは式ではありません

structと、構造体の要素を出力することになっている関数を使用して、次の簡単なプログラムを作成しました。

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

実行すると、エラーgo:16: type Salutation is not an expressionが表示されます。ここで何が悪いのでしょうか?

興味深いことに、sの定義をvar s = Salutation {"Alex", "Hi"}に変更すると、問題なく動作します。しかし、これらは基本的に同じエンティティを定義するための異なる構文方法です。それがエラーの原因がわからない理由です。

32
Morteza R

エラーはこの行にあります

    var s = Salutation

=の右側のものは値に評価されなければなりません。 Salutationは値ではなくタイプです。を宣言する3つの方法を次に示します。

 var s Salutation      // variable declaration using a type 

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

 s := Salutation{}     // short variable declaration

3つの宣言すべての結果は同じです。通常、3番目のバリエーションは2番目のバリエーションよりも優先されますが、パッケージレベルの変数を宣言するために使用することはできません。

言語仕様を参照してください 変数宣言のすべての詳細について

52
Cerise Limón

4番目の方法:

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

構造体は常に値ではなく参照で渡します。そして、常にプリミティブを値で渡します。

受信者メソッドとして書き直されたメソッド:

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

完全な例:

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