3 回答

TA貢獻1810條經驗 獲得超5個贊
我已經研究過這個主題,我認為如果您更改為 Employee 而不是 *Employee,那么 EmployeeByID(id) 將是一個無法尋址的值,因為它沒有分配給變量。如果你給它分配一個像下面這樣的變量就可以了:
e1 := EmployeeByID(id)
e1.Salary = 0

TA貢獻1864條經驗 獲得超2個贊
這個簡化的例子演示了這個問題:
package main
type t struct {
int
}
func newT() *t { return &t{} }
//func newT() t { return t{} }
func main() {
newT().int = 0
}
我的猜測是,如果您使用newT不返回指針的版本,并且永遠不會保存對 的結果的引用newT(),那么設置其int字段的值將永遠無法做任何有意義的事情。這類似于設置一個未使用的變量。
如果你使用的是非指針版本newT但你有類似的東西:
x := newT()
x.int = 0
那你就好了。
或者,使用newT上面的指針版本也可以,因為它可能會返回您之前已經定義的某些狀態,請參見示例:
package main
type t struct {
int
}
var dilbert = &t{3}
func newT() *t { return dilbert }
//func newT() t { return t{} }
func main() {
println(dilbert.int)
newT().int = 0
println(dilbert.int)
}

TA貢獻1744條經驗 獲得超4個贊
func EmployeeByID(id int) *Employee { /* ... */ }
這將返回一個指向 Employee 變量的指針。
func EmployeeByID(id int) Employee { /* ... */ }
這會返回一個值從一個Employee變量復制。在使用它之前,您需要將它分配給一個變量。
- 3 回答
- 0 關注
- 152 瀏覽
添加回答
舉報