2012-10-23 31 views
11

Có thể làm việc theo cách tương tự như quá tải hàm hoặc tham số tùy chọn trong C# bằng Golang không? Hoặc có thể là một cách khác?Thay thế cho quá tải hàm trong Go?

+0

bạn có thể cho một ví dụ cụ thể (cũng trong C#) những gì bạn muốn làm? –

+1

'Bộ nén công cộng void (chuỗi dstFilePath, chuỗi srcFilePath, string fileName)' 'public void Compresser (chuỗi srcFilePath, string fileName)' – Coder

+1

Có thể trùng lặp: http://stackoverflow.com/questions/2032149/optional-parameters – nemo

Trả lời

8

Không hỗ trợ trực tiếp chức năng quá tải hàm cũng như đối số tùy chọn. Bạn có thể làm việc xung quanh họ xây dựng cấu trúc đối số của riêng bạn. Ý tôi là như thế này (chưa được kiểm tra, có thể không làm việc ...) 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

đối số tùy chọn hiện được phép trong Go. kiểm tra điều này http://changelog.ca/log/2015/01/30/golang –

+0

@MohitBhura liên kết của bạn đáng để đọc nhưng không nói rằng các đối số tùy chọn hiện được cho phép. Trong thực tế nó đề xuất một cách khác nhau để làm việc xung quanh sự vắng mặt của họ, dựa trên giao diện trống rỗng và đối số variadic –

9

Câu trả lời thành ngữ với các thông số tùy chọn trong Go là chức năng wrapper:

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

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

Tái định nghĩa hàm đã cố tình bỏ qua, bởi vì nó làm cho mã khó đọc (er).

+2

* bởi vì nó làm cho mã khó đọc (er). * Đó là hoàn toàn chủ quan. Tôi không nghĩ như vậy, không phải lúc nào. –

2

Có một số gợi ý here sử dụng lập luận variadic, ví dụ:

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 
} 

Hoặc ...interface{} cho bất kỳ loại:

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>") 
} 
Các vấn đề liên quan