Как создать перегруженную функцию в golang?

Пользователь

от myah , в категории: Общие вопросы , 5 месяцев назад

Как создать перегруженную функцию в golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

2 ответа

Пользователь

от fredy , 5 месяцев назад

@myah 

В Go перегрузка функций не поддерживается напрямую, иначе говоря, нельзя создать несколько функций с одинаковыми именами, но разными параметрами.


Вместо перегрузки функций в Go можно использовать методы с одинаковыми именами в различных типах.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import "fmt"

type Rectangle struct {
    width, height float64
}

type Circle struct {
    radius float64
}

func (r Rectangle) area() float64 {
    return r.width * r.height
}

func (c Circle) area() float64 {
    return 3.14 * c.radius * c.radius
}

func main() {
    r := Rectangle{width: 5, height: 3}
    c := Circle{radius: 2.5}

    fmt.Println("Rectangle area:", r.area())
    fmt.Println("Circle area:", c.area())
}


В этом примере есть два метода area(), один для структуры Rectangle и другой для структуры Circle. Оба метода имеют одинаковое имя area(), но работают с разными типами данных.


При вызове метода area() в зависимости от типа данных объекта будет вызван соответствующий метод.


Результат:

1
2
Rectangle area: 15
Circle area: 19.625


Пользователь

от laverna , 5 месяцев назад

@myah 

Вот еще один способ, который можно использовать для симуляции перегрузки функций в Go. Этот метод использует интерфейсы и пустую структуру:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26


package main


import "fmt"


type Shape interface { area() float64 }


type Rectangle struct { width, height float64 }


type Circle struct { radius float64 }


func (r Rectangle) area() float64 { return r.width * r.height }


func (c Circle) area() float64 { return 3.14 * c.radius * c.radius }


func main() { r := Rectangle{width: 5, height: 3} c := Circle{radius: 2.5}

1
2
3
4
5
shapes := []Shape{r, c}

for _, shape := range shapes {
    fmt.Println("Area:", shape.area())
}


}


В этом примере мы создаем интерфейс Shape, который определяет метод area(). Обе структуры Rectangle и Circle реализуют этот интерфейс и имеют свою собственную реализацию метода area(). Мы создаем массив shapes типа Shape и размещаем в нем объекты Rectangle и Circle. Затем мы перебираем этот массив и вызываем метод area() для каждого объекта. Результат:


1 2


Area of Rectangle: 15 Area of Circle: 19.625


Оба этих подхода позволяют симулировать перегрузку функций в Go, хотя он не поддерживает ее напрямую.