Scopes
GO programlama dilinde süslü parantez ifadeleri ile {} ifade edilen scope (kapsamlar) ile değişkenlerin fonksiyon içinden ve dışından erişimleri kontrol edilir.
Örneğin :
package main
import "fmt"
func main(){
CallFromOutside()
}
func ScopeSample() {
// ilk scope
var birinci_degisken, ikinci_degisken int = 88, 95
fmt.Printf("Birinci Degisken : %d", birinci_degisken)
fmt.Printf("İkinci Degisken : %d", ikinci_degisken)
}
func CallFromOutside() {
// ikinci scope
fmt.Printf("%d", birinci_degisken)
}
Bu kodu çalıştırmak istediğimizde undefined: birinci_degisken hata mesajı ile karşılaşırız.
Biz birinci_degisken ifadesini ScopeSample içerisinde tanımlamıştık ve diğer bir scope içerisinde yer alan CallFromOutside fonksiyonu ifadesinin scope'undan çağırdığımızda birinci_degisken isimli bir değişkenimizin olmadığını belirtir. Çünkü bu ifade yalnızca ScopeSample isimli fonksiyon çalıştırıldığında geçici olarak oluşturulur ve bu fonksiyonda bir return ifadesi olmadığından dolayı scope dışına değer verilmez. Bundan dolayı birinci_degisken (yerel) local bir ifadedir.
Global Scopes
global değişken ifadeleri scope dışında tanımlanır ve scope içinden erişim sağlanabilir.
Örnek :
package main
import "fmt"
// global variable
var fruit = "Avacado"
func CallGlobal() {
fmt.Printf("My favourite fruit is %s \n", fruit)
}
func CallGlobalSecondTime() {
fmt.Printf("I like %s very much. \n", fruit)
}
func main(){
CallGlobal()
CallGlobalSecondTime()
}
Bu ifadeyi çalıştırdığımızda ise fruit isimli global değişkenimiz her iki fonksiyondan da çağrılabilir. Bu sayede ekranda iki farklı çıktı görüyoruz:
My favourite fruit is Avacado
I like Avacado very much.
Nested Scopes
İç içe geçmiş nested ifadelerde global ifadeler ve kapsayıcı scope içinde yer alan diğer local ifadelere erişim sağlanabilir.
Örnek :
package main
import "fmt"
var fruit = "Avacado"
func main(){
}
func NestedScope() {
drink := "apple juice"
vegetable := "tomato"
needDrink := false
needFruit := true
if needDrink {
fmt.Printf("Drink %s \n", drink)
} else {
fmt.Printf("Dont Drink %s eat %s \n", drink, vegetable)
}
if needFruit {
fmt.Printf("Get me %s", fruit)
}
}
Bu ifade çalıştırıldığında ise şu çıktıyı alırız:
Dont Drink apple juice eat tomato
Get me Avacado