這個問題與在 Go 中使用匿名欄位傳遞結構有關,但不同之處在于我正在處理一個處理父項陣列而不是一個結構的函式,即:
package main
import "fmt"
type Parent struct {
Dad string
}
type Child struct {
Parent
Son string
}
func myfunc(data []Parent) {
for n, _ := range data {
fmt.Printf("Dad is %s\n", data[n].Dad)
}
}
func main() {
data := make([]Child, 2)
data[0].Dad = "pappy"
data[0].Son = "sonny"
data[1].Dad = "daddy"
data[1].Son = "billy"
myfunc(data)
}
我試圖將資料投射到像這樣的父母陣列,myfunc([]Parent(data))但這沒有用,顯然解決方案myfunc(data.Parent)不會在陣列上作業。
在 golang 中是否有一個合理的解決方案,而無需創建新的切片或尚未結束 beta 的泛型?
干杯
uj5u.com熱心網友回復:
即使使用泛型,您也無法做到這一點。data[n].Dad不管用。
處理它的合理方法是使用介面,但仍然必須為它創建一個介面切片:
type WithDad interface {
GetDad() string
}
func (p Parent) GetDad() string {return p.Dad}
func myFunc(data []WithDad) {
...
}
...
arr:=make([]WithDad,0,len(data))
for _,x:=range data {
arr=append(arr,x)
}
myFunc(arr)
原因是型別系統如何作業以及切片如何傳遞。切片[]Child指向一個陣列,其中每個條目都是一個Child. 接受的函式需要[]Parent一個元素為 的切片Parent,這是一種不同的型別,因此您不能將一個傳遞給另一個。
切片[]WithDad指向一個陣列,其中每個條目都是一個介面。每個這樣的條目都指向另一個切片中的Child或Parent條目。
uj5u.com熱心網友回復:
Parent只是為了完整起見,我制作了我開始作業的 Burak Serdar 代碼的完整版本(我喜歡發布完整的作業示例供我稍后剪切和粘貼:P)...注意我故意回傳一個指向您可能會想要處理完整的結構,而不僅僅是讀取 1 個欄位。
package main
import "fmt"
type WithDad interface {
GetDad() *Parent
}
type Parent struct {
Dad string
}
func (p *Parent) GetDad() *Parent {
return p
}
type Child struct {
Parent
Son string
}
func (c *Child) GetDad() *Parent {
return &c.Parent
}
func myfunc(data []WithDad) {
for n, _ := range data {
fmt.Printf("Dad is %s\n", data[n].GetDad().Dad)
}
}
func main() {
data := make([]WithDad, 2)
data[0] = &Child{Parent: Parent{Dad: "pappy"}, Son: "sonny"}
data[1] = &Child{Parent: Parent{Dad: "daddy"}, Son: "billy"}
myfunc(data)
}
uj5u.com熱心網友回復:
您的 Child 結構是 Parent 和一個字串(我猜它包含名稱)的組合,沒有什么意義。孩子不是父母加上他們的名字。事實上,你只有一個概念,即人,他可能有父母。請考慮以下方法:
package main
import "fmt"
type Person struct {
Name string
Parent *Person
}
func myfunc(data []Person) {
for n, _ := range data {
fmt.PrintLn("My name is", n.Name)
if n.Parent != nil {
fmt.PrintLn("My dad is", n.Parent.Name)
}
}
}
func main() {
data := make([]Person, 2)
data[0].Name = "daddy"
data[1].Name = "billy"
data[1].Parent = &data[0]
myfunc(data)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417943.html
標籤:
下一篇:函式的語法
