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"}
に変更すると、問題なく動作します。しかし、これらは基本的に同じエンティティを定義するための異なる構文方法です。それがエラーの原因がわからない理由です。
エラーはこの行にあります
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番目のバリエーションよりも優先されますが、パッケージレベルの変数を宣言するために使用することはできません。
言語仕様を参照してください 変数宣言のすべての詳細について 。
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();
}