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?
Odpowiedz
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;
}
opcjonalne argumenty są teraz dozwolone w Go. sprawdź to http://changelog.ca/log/2015/01/30/golang –
@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 –
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.
* ponieważ utrudnia odczytanie kodu. * To całkowicie subiektywne. Nie sądzę, nie zawsze. –
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>")
}
można dać konkretny przykład (również w C#), co chcesz do zrobienia? –
'public void Compresser (string dstFilePath, string srcFilePath, string nazwa_pliku)' 'public void Compresser (string srcFilePath, string fileName)' – Coder
Możliwy duplikat: http://stackoverflow.com/questions/2032149/optional-parameters – nemo