[英]Golang how to range in pointer array
如果我有PersonManager結構,它有* [] Person數組。 我想要對此數組中的每個項目進行調整。 例如
manager := *PersonManager
for ii := 0; len(*manager.allPersons); ii++{
fmt.Println(manager.allPersons[:ii].name)
}
對於此示例,manager變量是指針和數組,在此變量中也是指針。 我該如何處理這些物品?
不是:我得到的不能切片manager.allPersons(類型* [] Person)錯誤
使用range
關鍵字。 https://github.com/golang/go/wiki/Range
for i, person := range *manager.allPerson {
fmt.Println(person.name)
}
請注意,如果不使用索引var i
,編譯器會生氣。 如果您不打算使用它,請用_
替換。
為了進一步解釋,您的原始錯誤是由於您第一次正確解除引用*[]Person
的事實,而不是for
循環內部。
fmt.Println(manager.allPersons[:ii].name) // wrong
fmt.Println((*manager.allPersons)[:ii].name) // right
此外,假設您的slice
包含Person
結構值 ,如果您在range
表達式中使用可選的第二個值 ,則必須復制它。 因此,僅使用索引會更有效。
作為建議,不要使用*[]Person
,使用[]*Person
,這可能是您打算使用的。 slice
已經是指針值。 使用[]*Person
您不必擔心range
表達式的副本,因為它只是指向Person
而不是整個struct的指針。
實際上,除非您將類型更改為[]*Person
或索引到slice
,否則您將無法在切片中反映更改,因為struct值將是range
循環中的副本。 請參閱https://github.com/golang/go/wiki/Range#gotchas,但請注意,如果值是指針值,則這不是問題。
我想你可能會被指針混淆了。 您無需在任何地方取消引用指針。 這樣的事情應該有效:
for i := 0; i < len(manager); i++ {
fmt.Println(manager[i].Name)
}
GoPlay: https : //play.golang.org/p/P8wAp4wIGs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.