簡體   English   中英

Golang如何在指針數組范圍內

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM