错误:struct Type不是表达式

时间:2014-12-13 03:13:16

标签: struct go

使用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"}时,它的工作正常。但它们基本上是用于定义同一实体的不同语法方式。这就是我不理解错误来源的原因。

2 个答案:

答案 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

所有三个声明的结果都是相同的。第三种变体通常优先于第二种变体,但不能用于声明包级变量。

请参阅语言规范for all of the details on variable declarations

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