Ö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]}
bende yok'
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@ 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
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