Go, fonksiyon argümanları için isteğe bağlı parametreler ve varsayılan değerleri yerel olarak desteklemiyor — her fonksiyon yalnızca imzasında belirtilen argüman setini kabul ediyor. Bu tasarım kararı, modelin genel sadeliği ve kodun öngörülebilirliği ile ilgilidir.
Diğer dillerde, örneğin Python veya C++, isteğe bağlı/varsayılan parametreler, bir fonksiyonun davranışını esnek bir şekilde tanımlamaya olanak tanır. Go, okuma ve kesinlik için bunu feda etti.
API'yi esnek hale getirmek istediğinizde, varsayılan değerleri basitçe belirlemek mümkün değildir — tüm parametreleri açıkça geçmeniz veya dolaylı desenler kullanmanız gerekir. Bu, birçok seçenek eklemek için desteği zorlaştırır ve aşırı yüklenmiş fonksiyon sayısının artmasına yol açabilir.
Go'da bu tür bir esneklik için iki yaklaşım kullanılır:
Yapı aracılığıyla yaklaşım örneği:
type QueryOptions struct { Limit int Offset int } func QueryDB(opts QueryOptions) { if opts.Limit == 0 { opts.Limit = 10 // varsayılan } // ... } QueryDB(QueryOptions{Limit: 100})
Ya da işlevsel seçenekler aracılığıyla:
type Config struct { Timeout int } type Option func(*Config) func WithTimeout(t int) Option { return func(cfg *Config) { cfg.Timeout = t } } func Do(opts ...Option) { cfg := Config{Timeout: 5} // varsayılan for _, o := range opts { o(&cfg) } // ... } Do(WithTimeout(10)) // seçenek ile çağrı Do() // varsayılan ile çağrı
Anahtar özellikler:
Fonksiyonun ilanında varsayılan bir değer belirlemek mümkün mü, örneğin func F(a int = 10)?
Hayır, Go'da böyle bir kayıt açılamaz — yalnızca gerekli parametrelerin kesin bir listesi.
...interface{} türünde bir dilimle fonksiyon ilan edilirse ve 0 argüman ile geçilirse ne olur?
Dilim 0 uzunluğuna (nil) sahip olacaktır, fonksiyon boş bir dilim alacaktır.
Kod örneği:
func PrintAll(args ...interface{}) { fmt.Println(len(args)) // parametre geçmezse 0 } PrintAll() // tamam
Go'da parametre sayısına veya türüne göre fonksiyonları aşırı yükleyebilir miyiz?
Hayır, Go'da fonksiyon aşırı yüklemesi desteklenmez — farklı imzalara sahip aynı isimdeki fonksiyonlar kabul edilmez.
API fonksiyonu onlarlaca parametreye sahiptir, bunların çoğu aynı türdendir, yanlışlıkla sırayı karıştırır:
Artıları:
Eksileri:
Seçenek yapısı veya fonksiyonel seçenekler kullanılır, parametrelerin açık isimleri vardır:
Artıları:
Eksileri: