错误:struct Type不是表达式

Mor*_*a R 33 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)
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到了错误go:16: type Salutation is not an expression.这里出了什么问题?

有趣的是,当我改变定义时s,var s = Salutation {"Alex", "Hi"}它的工作正常.但它们基本上是用于定义同一实体的不同语法方式.这就是我不理解错误来源的原因.

Cer*_*món 54

错误就在这条线上

    var s = Salutation
Run Code Online (Sandbox Code Playgroud)

=右边的东西必须评估为一个值.Salutation是类型,而不是价值.以下是声明s的三种方法:

 var s Salutation      // variable declaration using a type 

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

 s := Salutation{}     // short variable declaration
Run Code Online (Sandbox Code Playgroud)

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

有关变量声明的所有详细信息,请参阅语言规范.


J.M*_*SON 7

第四种方式:

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

我总是通过引用传递结构,而不是值。并且始终按值传递原语。

您的方法重写为接收器方法:

func (s *Salutation) Greet()() {
    fmt.Println(s.name)
    fmt.Println(s.greeting)
}
Run Code Online (Sandbox Code Playgroud)

完整示例:

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();
}
Run Code Online (Sandbox Code Playgroud)