SORU
11 NİSAN 2013, PERŞEMBE


Değişim golang içinde yineleme süre değerleri

Hadi bu tür olduğunu varsayalım :

type Attribute struct {
    Key, Val string
}
type Node struct {
    Attr []Attribute
}

ve benim düğümün öznitelikleri değiştirmek için yineleme devam etmek istiyorum.

Yapabilmeyi çok isterdim

for _, attr := range n.Attr {
    if attr.Key == "href" {
        attr.Val = "something"
    }
}

ama attr bir işaretçi değil, bu işe yaramaz ve yapmak zorundayım

for i, attr := range n.Attr {
    if attr.Key == "href" {
        n.Attr[i].Val = "something"
    }
}

Daha basit ya da daha hızlı bir yolu var mı ? Doğrudan range göstermeniz mümkün mü ?

Belli ki sadece yineleme için yapılarını değiştirmek istemiyorum Daha fazla ayrıntılı çözümleri hiçbir çözümleri vardır

CEVAP
11 NİSAN 2013, PERŞEMBE


Hayır, istediğiniz kısaltması mümkün değildir.

Bunun nedeni range kopya üzerinden yineleme sensin dilimden değerleri. specification about range diyor ki:

Range expression                          1st value             2nd value (if 2nd variable is present)
array or slice  a   [n]E, *[n]E, or []E   index    i  int       a[i]       E

Menzil çok diziler için ikinci değeri a[i] kullandığı etkili olduğu anlamına gelir/dilim değer orijinal değer dokunulmaz hale kopyalanır.

Bu davranış following code ile gösterilmiştir:

x := make([]int, 3)

x[0], x[1], x[2] = 1, 2, 3

for i, val := range x {
    println(&x[i], "vs.", &val)
}

Kod aralığı değeri ve gerçek için tamamen farklı bellek konumlarını yazdırır dilim değer:

0xf84000f010 vs. 0x7f095ed0bf68
0xf84000f014 vs. 0x7f095ed0bf68
0xf84000f018 vs. 0x7f095ed0bf68

Yapabileceğiniz tek şey işaretçileri veya zaten jnml ve peterSO tarafından önerilen dizin kullanmaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • Hudson Music

    Hudson Music

    13 Mart 2007
  • Pituvision

    Pituvision

    11 Mart 2006