2012-10-23 9 views
11

Czy możliwe jest działanie w podobny sposób jak przeciążanie funkcji lub parametr opcjonalny w języku C# przy użyciu programu Golang? A może w inny sposób?Alternatywa dla przeciążenia funkcji w Go?

+0

można dać konkretny przykład (również w C#), co chcesz do zrobienia? –

+1

'public void Compresser (string dstFilePath, string srcFilePath, string nazwa_pliku)' 'public void Compresser (string srcFilePath, string fileName)' – Coder

+1

Możliwy duplikat: http://stackoverflow.com/questions/2032149/optional-parameters – nemo

Odpowiedz

8

Ani przeciążanie funkcji, ani opcjonalne argumenty nie są obsługiwane bezpośrednio. Możesz obejść je, budując własną strukturę argumentów. Znaczy tak (niesprawdzone, mogą nie działać ...) EDIT: now tested...

package main 

    import "fmt" 

    func main() { 
     args:=NewMyArgs("a","b") // filename is by default "c" 
     args.SetFileName("k") 

     ret := Compresser(args) 
     fmt.Println(ret) 
    } 

    func Compresser(args *MyArgs) string { 
     return args.dstFilePath + args.srcFilePath + args.fileName 
    } 

    // a struct with your arguments 
    type MyArgs struct 
    { 
     dstFilePath, srcFilePath, fileName string 
    } 

    // a "constructor" func that gives default values to args 
    func NewMyArgs(dstFilePath string, srcFilePath string) *MyArgs { 
     return &MyArgs{ 
       dstFilePath: dstFilePath, 
       srcFilePath:srcFilePath, 
       fileName :"c"} 
    } 

    func (a *MyArgs) SetFileName(value string){ 
     a.fileName=value; 
    } 
+0

opcjonalne argumenty są teraz dozwolone w Go. sprawdź to http://changelog.ca/log/2015/01/30/golang –

+0

@MohitBhura Twój link jest wart odczytu, ale nie mówi, że opcjonalne argumenty są teraz dozwolone. W rzeczywistości sugeruje inny sposób obejścia ich nieobecności, oparty na pustych interfejsach i argumentach variadic –

9

idiomatyczne odpowiedź do opcjonalnych parametrów w Go jest funkcje Wrapper: przeciążanie

func do(a, b, c int) { 
    // ... 
} 

func doSimply(a, b) { 
    do(a, b, 42) 
} 

Funkcja została celowo pozostawiona na zewnątrz, ponieważ sprawia, że ​​kod jest trudny do przeczytania.

+2

* ponieważ utrudnia odczytanie kodu. * To całkowicie subiektywne. Nie sądzę, nie zawsze. –

2

Istnieje kilka wskazówek here wykorzystaniem zmiennej liczbie argumentów argumentów, na przykład:

sm1 := Sum(1, 2, 3, 4) // = 1 + 2 + 3 + 4 = 10 
sm2 := Sum(1, 2) // = 1 + 2 = 3 
sm3 := Sum(7, 1, -2, 0, 18) // = 7 + 1 + -2 + 0 + 18 = 24 
sm4 := Sum() // = 0 

func Sum(numbers ...int) int {  
    n := 0  
    for _,number := range numbers { 
     n += number 
    }  
    return n 
} 

Albo ...interface{} dla wszelkich typów:

Ul("apple", 7.2, "BANANA", 5, "cHeRy") 

func Ul(things ...interface{}) { 
    fmt.Println("<ul>")  
    for _,it := range things { 
    fmt.Printf(" <li>%v</li>\n", it) 
    }  
    fmt.Println("</ul>") 
}