Golang'da Yansıma Nedir?

Golang Da Yansima Nedir



Golang'daki yansıma, bir programın çalışma zamanında veri yapılarını, türlerini ve değerleri incelemesine ve değiştirmesine olanak tanır. Çalışma zamanında herhangi bir değişkenin türünü ve değerini incelememize, yeni tür örnekleri oluşturmamıza ve mevcut değişkenlerin değerini değiştirmemize izin veren bir dizi işlev sağlar. Bu makale, yansıtma paketindeki farklı Golang işlevlerini kapsar.

İçindekiler

Go, statik olarak yazılmış bir dildir, bu nedenle derleme zamanında bir değişkenin türü bilinmelidir. Ancak bazı senaryolarda, program çalıştırılana kadar türü belirlenemeyen değerlerin işlenmesi gerekebilir.







Örneğin, farklı argüman türleri ile çalışabilen bir işlev yazmamız gerekebilir veya bilinmeyen türdeki verileri serileştirmemiz ve serisini kaldırmamız gerekebilir. Golang'da yansıtma paketinin kullanıldığı yer burasıdır.



Go'da Paketi Yansıt

Reflect paketi, türleri ne olursa olsun çalışma zamanında değerleri incelememize ve değiştirmemize izin veren bir dizi işlev sağlar. Bu fonksiyonlar ile herhangi bir değişkenin türü ve değeri hakkında bilgi alabilir, yeni tür örnekleri oluşturabilir ve mevcut değişkenlerin değerini değiştirebiliriz.



Golang'daki yansıtma paketi iki tür içerir: Tür ve Değer. Type, int, string veya özel bir yapı gibi bir Go türünü temsil eder. Değer, 42 veya 'merhaba' gibi belirli bir türdeki değeri temsil eder.





Reflect paketi ayrıca değişkenlerden Type ve Value nesnelerini elde etmemizi sağlayan bir dizi işlev sağlar. Örneğin, Reflect.TypeOf() işlevi, bir değişkenin türünü temsil eden bir Type nesnesi döndürürken, Reflect.ValueOf() işlevi, değişken değerini gösteren bir Value nesnesi verir.

Aşağıdaki bölümlerde, yansıma paketinde yaygın olarak kullanılan bazı işlevleri inceleyeceğiz.



Reflect.Copy() İşlevi

Reflect paketinin Reflect.Copy() işlevi, bir dilimin değerlerini başka bir dilime kopyalamak için kullanılır. Her ikisi de aynı eleman tipine sahip dilim değerleri olması gereken dst ve src olmak üzere iki parametre alır. İşlev, kaynak dilimindeki değerleri dst dilimine kopyalar ve kopyalanan öğelerin sayısını döndürür.

Reflect.Copy() işlevi aşağıdaki örnekte gösterilmektedir:

paket ana

içe aktarmak (

'fmt'
'yansıtmak'
)
işlev ana () {
kaynak := [] int { 1 , 2 , 3 , 4 , 5 }
dst := yapmak ([] int , sadece ( kaynak ))
N := yansıtmak . Kopyala ( yansıtmak . Değeri ( dst ), yansıtmak . Değeri ( kaynak ))
fmt . Yazdır ( N ) // Çıktı: 5
fmt . Yazdır ( dst ) // Çıktı: [1 2 3 4 5]


}

Bu örnekte, bazı tamsayı değerleri olan bir kaynak dilim kaynak ve kaynak ile aynı uzunlukta bir hedef dilim dst oluşturuyoruz. Daha sonra, src'den dst'ye değerleri kopyalamak ve kopyalanan öğelerin sayısını (n) ve dst diliminin içeriğini yazdırmak için Reflect.Copy()'yi çağırırız.

Reflect.DeepEqual() İşlev

Reflect paketinin Reflect.DeepEqual() işlevi, eşitlik için iki değeri karşılaştırmak için kullanılır. Bu işlev, her ikisi de herhangi bir türde herhangi bir değerde olabilen a ve b olmak üzere iki giriş parametresine sahiptir. İşlev, a ve b derinden eşitse, yani temel değerleri özyinelemeli olarak eşitse, true değerini döndürür. Aksi takdirde, yanlış olduğu ortaya çıkıyor.

Aşağıdaki örnek, Reflect.DeepEqual() işlevinin nasıl kullanılacağını gösterir:

paket ana

içe aktarmak (

'fmt'
'yansıtmak'
)
işlev ana () {
A := [] int { 1 , 2 , 3 }
B := [] int { 1 , 2 , 3 }
eğer yansıtmak . DerinEşit ( A , B ) {
fmt . Yazdır ( 'a ve b eşittir' )
} başka {
fmt . Yazdır ( 'a ve b eşit değil' )
}


}

Bu örnekte, aynı tamsayı değerlerine sahip iki dilim a ve b oluşturuyoruz. Daha sonra eşitlik için a ve b'yi karşılaştırmak ve sonucu yazdırmak için Reflect.DeepEqual()'ı çağırırız.

Reflect.Swapper() İşlevi

Reflect paketinin Reflect.Swapper() işlevi, bir dilimin öğelerini değiştirebilen bir işlev döndürmek için kullanılır. Bir dilim değeri olması gereken tek bir parametre v alır. İşlev, i ve j olmak üzere iki tamsayı parametresi alan ve dilimin i ve j konumlarındaki öğelerini değiştiren bir işlev döndürür.

Reflect.Swapper() kullanımı aşağıdaki örnekle gösterilebilir:

paket ana

içe aktarmak (

'fmt'
'yansıtmak'
)
işlev ana () {
S := [] int { 1 , 2 , 3 , 4 , 5 }
takas := yansıtmak . takasçı ( S )
takas ( 1 , 3 )
fmt . Yazdır ( S ) // Çıktı: [1 4 3 2 5]


}

Bu örnekte, bazı tamsayı değerleri olan s adında bir dilim oluşturduk. Ardından, dilimin öğelerini değiştirebilen bir işlev takası elde etmek için Reflect.Swapper()'ı çağırırız. s diliminin 1. ve 3. konumlarındaki öğeleri değiştirmek ve sonucu yazdırmak için takas kullanırız.

Reflect.TypeOf() İşlev

Reflect.TypeOf(), bir değerin türünü almak için kullanılır. Bu işlev, herhangi bir türde veya değerde olabilecek tek bir 'v' parametresini kabul eder. İşlev, değerin türünü temsil eden bir Reflect.Type değeri döndürür.

Reflect.TypeOf() kullanımı aşağıdaki örnekle gösterilebilir:

paket ana

içe aktarmak (

'fmt'
'yansıtmak'
)
işlev ana () {
öyleydi X şamandıra64 = 3 . 14
T := yansıtmak . Bir çeşit ( X )
fmt . Yazdır ( T ) // Çıktı: float64


}

Bu örnekte, 3.14 değerine sahip bir float64 değişkeni x oluşturuyoruz. Daha sonra x'in türünü almak ve sonucu bir t Reflect.Type değişkeninde saklamak için Reflect.TypeOf()'u çağırırız. Float64 olan t değerini yazdırıyoruz.

Reflect.ValueOf() İşlev

Reflect.ValueOf(), bir değerin bir Reflect.Value temsilini alabilir. Herhangi bir türden herhangi bir değer olabilen tek bir v parametresi alır. İşlev, giriş parametresinin değerini temsil eden bir Reflect.Value değeri döndürür.

Reflect.ValueOf() kullanımı aşağıdaki örnekle gösterilebilir:

paket ana

içe aktarmak (

'fmt'
'yansıtmak'
)
işlev ana () {
öyleydi X şamandıra64 = 3 . 14
içinde := yansıtmak . Değeri ( X )
fmt . Yazdır ( içinde ) // Çıktı: 3.14

}

Bu örnekte, 3.14 değerine sahip bir float64 değişkeni x oluşturuyoruz. Daha sonra, x'in bir yansıtma-değer temsilini elde etmek ve sonucu bir yansıtma-değer değişkeni v'de depolamak için Reflect.ValueOf()'u çağırırız. v'nin 3.14 olan değerini yazdırırız.

Reflect paketi, belirtilenlerin ötesinde çok sayıda işlev sağlar ve bunlar sadece birkaç örnektir. Reflect paketinin sağladığı işlevleri kullanarak, derleme zamanında türü bilmemize gerek kalmadan herhangi bir türdeki değerlerle çalışabilen kodlar oluşturabiliriz.

Çözüm

Golang'daki yansıma, bir programın çalışma zamanında veri yapılarını, türlerini ve değerleri incelemesine ve değiştirmesine olanak tanır. Türleri ve değerleri incelemek ve değiştirmek için işlevler sağlayan Reflect paketi aracılığıyla uygulanır. Yansıma özellikle arabirimlerle, bilinmeyen türlerle çalışırken veya genel işlevleri uygulamanız gerektiğinde kullanışlıdır. Bu makale, Golang'daki yansımanın temellerini, yansıtma paketi, yansıtma Türü ve Değeri ve dinamik tür ve değer dahil tartıştı.