2016-03-21 12 views
1

Varolan bir yapıdan nesne ve yapı nasıl değiştirilir? Ben bir yapı var

type person struct{ 
    name string 
    phone string 
    address string 
} 

demek ve ben (telefon ve adresini değiştirmek) Ben sadece nesneyi değil yapı var bu haline çevrilmesi istiyorum.

type person2 struct { 
    name string 
    phone []struct { 
     value string 
    } 

    address []struct { 
     value string 
    } 
} 

sahip olduğumu nasıl birine dayalı yeni bir yapı oluşturabilir? Sadece seçili alanları dönüştürmek istiyorum.

Yansımaya baktım ama nereden başlayacağını/nasıl kullanılacağını bilmiyorum.

cevap

4

Önsöz: Yalnızca tip person değil person2 varsa, önce person2 yazmak zorunda. Git, statik olarak yazılmış bir dildir, çalışma zamanında yalnızca person2 oluşturamazsınız. Manuel olarak person2 yazabilir veya jeneratör kodunu kendiniz yazarak go generate kullanabilirsiniz, ancak daha kolay olmayacaktır.

mimic için dinamik bir yapıya map[string]interface{} gibi bir şey de kullanabilirsiniz, ancak bu daha kolay ve daha hızlı olmayacaktır.


person bir değerden person2 değerini oluşturmak için ... Eğer değer türü interface{} olduğu gibi tip iddialarını kullanmak zorunda söz, yansıma gerek yoktur, sadece kodu manuel can o: Bu biraz garip görünebilir ve siz person2.phone ve person2.address anonim yapı bir dilim kullanılan çünkü, ve bir composite literal ile anonim yapı başlatmak için olduğunu

func transform(p person) person2 { 
    return person2{ 
     p.name, 
     []struct{ value string }{{p.phone}}, 
     []struct{ value string }{{p.address}}, 
    } 
} 

Not anonim yapı tanımı olmak zorunda tekrarladı.

bunu test edilmesi:

p := person{"Bob", "1234", "New York"} 
fmt.Println(p) 
p2 := transform(p) 
fmt.Println(p2) 

Çıkış (Go Playground üzerinde denemek):

{Bob 1234 New York} 
{Bob [{1234}] [{New York}]} 

Not: person2 gereksiz yere karmaşık olduğunu

Not.

func transform(p person) person2 { 
    return person2{p.name, []string{p.phone}, []string{p.address}} 
} 

Çıkış (Go Playground üzerinde denemek):

{Bob 1234 New York} 
{Bob [1234] [New York]} 
+0

bende yok'

type person2 struct { name string phones []string addresses []string } 

Ve

sonra transformasyon tek liner geçerli: bu kadar basit olabilir Person2 sahip olmalıyım, önce Kişi'yi kullanarak üretmem gerekiyor. Transforme edilmesi gereken az sayıdaki alan haricinde çoğunlukla Kişi ile aynıdır. – user568109

+0

@ user568109 Eğer 'person2' (henüz) 'niz yoksa ve' siz 'kişiyseniz, önce 'person2' yazmalısınız. Git statik olarak yazılmıştır. Çalışma zamanı sırasında yeni türler oluşturamazsınız. – icza

+0

Kullandığım yapı büyük, bu yüzden oluşturma aracını kullanmam gerekecek.Bunu nasıl kullanacağınız hakkında herhangi bir işaretçi. – user568109