英文:
Error: struct Type is not an expression
问题
使用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"}
时,它可以正常工作。但它们基本上是定义相同实体的不同语法方式。这就是我不理解错误来源的原因。
英文:
Using struct
and a function that is supposed to print out the struct's elements, I have written this simple program:
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)
}
When I run it I get the error go:16: type Salutation is not an expression
. What goes wrong here?
Interestingly enough, when I change the definition of s
to var s = Salutation {"Alex", "Hi"}
it works just fine. But they are basically different syntactic ways to define the same entity. That's why I don't understand the source of the error.
答案1
得分: 90
错误出现在这一行:
var s = Salutation
等号右边的内容必须求值为一个值。Salutation
是一个类型,不是一个值。以下是三种声明变量 s
的方式:
var s Salutation // 使用类型进行变量声明
var s = Salutation{} // 使用值进行变量声明
s := Salutation{} // 简短变量声明
这三种声明的结果是相同的。通常情况下,第三种方式比第二种方式更受欢迎,但不能用于声明包级别的变量。
有关变量声明的详细信息,请参阅语言规范 Variable declarations。
变量声明和字段初始化可以合并为一条语句:
var s = Salutation{name: "Alex", greeting: "Hello"} // 变量声明
s := Salutation{name: "Alex", greeting: "Hello"} // 简短变量声明
英文:
The error is on this line
var s = Salutation
The thing to the right of the = must evaluate to a value. Salutation
is a type, not value. Here are three ways to declare s:
var s Salutation // variable declaration using a type
var s = Salutation{} // variable declaration using a value
s := Salutation{} // short variable declaration
The result of all three declarations is identical. The third variation is usually preferred to the second, but cannot be used to declare a package-level variable.
See the language specification for all of the details on variable declarations.
The variable declaration and field initializations can be combined into a single statement:
var s = Salutation{name: "Alex", greeting: "Hello"} // variable declaration
s := Salutation{name: "Alex", greeting: "Hello"} // short variable declaration
答案2
得分: 6
第四种方法:
*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();
}
英文:
4th way:
*var s Salutation = &( Salutation{} );
I always pass structs by reference, not value.
And always pass primitives by value.
Your method re-written as a reciever method:
func (s *Salutation) Greet()() {
fmt.Println(s.name)
fmt.Println(s.greeting)
}
Full Example:
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();
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论