Đa hình thời gian biên dịch trong Golang

Post on: 2023-04-17 22:54:05 | in: Golang
Đa hình thời gian biên dịch trong Go được thực hiện thông qua sự chuyển đổi kiểu dữ liệu và việc sử dụng các tham số và đối số trong hàm.

Trong đa hình thời gian biên dịch, cuộc gọi được giải quyết trong thời gian biên dịch bởi trình biên dịch. Một số dạng của đa hình thời gian biên dịch bao gồm:

  • Method/Function Overloading: nhiều phương thức / hàm tồn tại cùng tên nhưng với các chữ ký khác nhau hoặc có thể có các kiểu trả về khác nhau.
  • Operator Overloading: Cùng một toán tử được sử dụng để thao tác trên các kiểu dữ liệu khác nhau.

Go không hỗ trợ Nạp chồng phương thức. Ví dụ, chương trình dưới đây minh họa rằng Go không hỗ trợ Nạp chồng phương thức.

package main

type maths struct{}

func (m *maths) add(a, b int) int {
    return a + b
}

func (m *maths) add(a, b, c int) int {
    return a + b + c
}

func main() {
   m := &maths{}
}

Output:

(*maths).add redeclared in this block
        previous declaration at ./main.go:5:6

Điều đó có nghĩa là Go cũng không hỗ trợ việc nạp chồng toán tử. Lý do cho điều này được nêu trong faq của Go - https://golang.org/doc/faq#overloading

Việc điều phối phương thức được đơn giản hóa nếu nó không cần phù hợp với kiểu. Kinh nghiệm với các ngôn ngữ khác cho chúng tôi thấy rằng việc có nhiều phương thức cùng tên nhưng có chữ ký khác nhau đôi khi hữu ích nhưng đó cũng có thể làm cho việc sử dụng trở nên rắc rối và dễ vỡ trong thực tế. Việc phù hợp chỉ bằng tên và yêu cầu tính nhất quán trong các kiểu là một quyết định đơn giản hóa quan trọng trong hệ thống kiểu của Go. Đối với việc nạp chồng toán tử, nó dường như chỉ là một tiện ích hơn là một yêu cầu tuyệt đối. Một lần nữa, mọi thứ đều đơn giản hơn nếu không có nạp chồng toán tử.

Bây giờ câu hỏi là có bất kỳ phương thức nạp chồng nào khác cho phép trong GO hay không. Đó là lý do tại sao hàm biến thể (variadic function) trong go được sử dụng. Xem chương trình bên dưới.

package main

import "fmt"

type maths struct{}

func (m *maths) add(numbers ...int) int {
    result := 0
    for _, num := range numbers {
        result += num
    }
    return result
}

func main() {
    m := &maths{}

    fmt.Printf("Result: %d\n", m.add(2, 3))
    fmt.Printf("Result: %d\n", m.add(2, 3, 4))
}

Output:

Result: 5
Result: 9

Kết luận

Go không hỗ trợ trực tiếp việc nạp chồng phương thức/hàm/toán tử, nhưng hàm đa tham số là một cách để đạt được điều này với sự phức tạp mã lệnh tăng lên.

Tag: go Golang nâng cao