我對我的簡單程式的輸出感到困惑。我希望在輸出中獲得所有四個名字,但我無法在輸出中獲得第一個名字。請幫我清除這個,或者一些關于那個的資源。
type Employees struct {
Name string
}
func main() {
chandran := Employees{Name: "Chandran"}
darpan := Employees{Name: "Darpan"}
ishaan := Employees{Name: "Ishaan"}
manbir := Employees{Name: "Manbir"}
Employees.structName(chandran, darpan, ishaan, manbir)
}
func (e Employees) structName(names ...Employees){
fmt.Println(names)
}
Go Playground 中的代碼
uj5u.com熱心網友回復:
Go 中沒有“靜態”方法。要呼叫一個方法,您必須有一個接收者型別的值,并在該值上呼叫該方法。
所以你必須這樣稱呼它:
var e Employees
e.structName(chandran, darpan, ishaan, manbir)
或者干脆:
Employees{}.structName(chandran, darpan, ishaan, manbir)
這兩個輸出(在Go Playground上試試):
[{Chandran} {Darpan} {Ishaan} {Manbir}]
為什么你的版本省略了第一個引數?
因為您擁有的實際上是一個方法運算式,并且您正在呼叫該方法運算式。
讓我們詳細看看它:
Employees.structName
是一個方法運算式,它是一個可呼叫的函式。它的簽名是structName方法的簽名,引數串列以接收者為前綴。所以型別Employees.structName是:
func(main.Employees, ...main.Employees)
您通過傳遞 4 個員工來呼叫它,其中第一個將是接收者,只有剩下的 3 個將用作names引數。所以只會列印從第二個開始的名字。
uj5u.com熱心網友回復:
根據語言規范:
https://go.dev/ref/spec#Method_expressions
表達方式
Employees.structName(chandran, darpan, ishaan, manbir)
相當于:
chandran.strucName(darpan,ishaan,manbir)
這是因為函式的第一個引數Employees.structName被解釋為方法的接收者。
如果你這樣做:
Employees{}.structName(chandran, darpan, ishaan, manbir)
它將列印所有四個元素。
uj5u.com熱心網友回復:
我認為您應該命名您的 Strut 員工而??不是員工。因為它只代表一名員工。如果您想對一組(切片)員工使用方法。
type Employee struct {
Name string
}
type Employees struct {
employees []Employee
}
然后在該組型別員工上定義函式:
func (e *Employees) Add(names ...Employee) {
e.employees = append(e.employees, names...)
}
func (e Employees) structName() {
fmt.Println(e.employees)
}
我在 Go Playground 上做了一個帶有 Add 和 StructName 函式的演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/371090.html
