2016-07-14 23 views
5

Bir tür olarak tanımlanır varsa: Kaydedilmemiş alan ile bir yapı nasıl kopyalanır?

type T struct { 
    S string 
    is []int 
} 

sonra nasıl bu tür bir nesnenin klonlama hakkında gidebilir

? Ben basit bir atama yaparsanız:
p := T{"some string", []int{10, 20}} 
q := p 

Sonra []int yapılan değişiklikler hem nesneleri etkiler. T.is dışa aktarılmadığından, yansıtmayı kullanarak ayıklanmış olsa bile, açıkça kopyalanamaz.

Şu anda paketinde Clone yöntemi satıyorum. Ancak bu, diğer paketlerdeki benzer tiplerde yardımcı olmaz. Bunu yapmanın başka bir yolu var mı?

cevap

5

Yapamazsınız. Bu, gönderilmemiş alanların noktasıdır: yalnızca bildiren paket bunları değiştirebilir. T tip başka pakette beyan edilmesi durumunda

Not, hatta yazamazsınız o: ​​

p := somepackage.T{"some string", []int{10, 20}} 

bu örtük böylece derleme zamanı hatası sonucu unexported T.is alanını ayarlamak için denemek ve çünkü :

implicit assignment of unexported field 'is' in somepackage.T literal 

sahibi (veya değiştirebilir) paket, iyi bir Clone() yöntem veya işlev sağlamak veya türeiçin SetIs() yöntem sağlamaktır 0. Üçüncü taraf bir paket böyle bir işlev sunmuyorsa, bu konuda yapabileceğiniz bir şey yoktur.

Not o tür şeyleri yapmaya mümkündür, ancak isminde olduğu gibi unsafe paketini kullanarak: Bu güvensiz ve sen ondan uzak durmalısın.

Ayrıca is kopyalanmaz T yeni değerler oluşturabilir ancak Türünün zero value olacağını unutmayın (ki []int durumunda nil olacaktır):

var r somepackage.T 
s := somepackage.T{S: p.S} 

fmt.Printf("%q\n", r) 
fmt.Printf("%q\n", s) 

Hangi çıktısı:

{"" []} 
{"some string" []} 

Ama unexported alanda T.is için sıfır olmayan herhangi bir değeri olamaz.

İlgili konular