범위가 키와 값의 “복사본”을 반환하는 것을 보았습니다. 해당 범위에서 항목의 주소를 반환하는 방법이 있습니까? 예
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for _, e := range array {
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
http://play.golang.org/p/AFOGG9NGpx
여기서 “필드”는 범위가 필드의 복사본을 보내기 때문에 수정되지 않습니다. 인덱스를 사용해야합니까 아니면 값을 수정하는 다른 방법이 있습니까?
읽어 주셔서 감사합니다.
답변
짧고 직접적인 대답 : 아니요, 값 대신 배열 인덱스를 사용하십시오.
따라서 위의 코드는 다음과 같습니다.
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for idx, _ := range array {
array[idx].field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
답변
이미 주석에서 언급되었지만 즉시 답변을 찾는 사람들을 위해 포인터 조각을 사용하고 원본 코드를 최소한으로 변경하여 예상되는 결과를 얻을 수있는 방법은 다음과 같습니다.
package main
import "fmt"
type MyType struct {
field string
}
func main() {
// Slice of pointers instead of slice of type
var array [10]*MyType
// Initialize array manually
for idx := range array {
array[idx] = &MyType{}
}
for _, e := range array {
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
여기는 놀이터입니다
답변
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for index := range array {
array[index].field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}