使用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)
所有三个声明的结果都是相同的.第三种变体通常优先于第二种变体,但不能用于声明包级变量.
有关变量声明的所有详细信息,请参阅语言规范.
第四种方式:
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)
| 归档时间: |
|
| 查看次数: |
34873 次 |
| 最近记录: |