使用struct
和一个应该打印出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"}
时,它的工作正常。但它们基本上是用于定义同一实体的不同语法方式。这就是我不理解错误来源的原因。
答案 0 :(得分:50)
错误在这一行
var s = Salutation
=右边的东西必须评估为一个值。 Salutation
是类型,而不是值。以下是声明s的三种方法:
var s Salutation // variable declaration using a type
var s = Salutation{} // variable declaration using a value
s := Salutation{} // short variable declaration
所有三个声明的结果都是相同的。第三种变体通常优先于第二种变体,但不能用于声明包级变量。
答案 1 :(得分:1)
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();
}