детская площадка
package main
import (
"fmt"
"math"
)
// types
type square struct {
length float64
}
type circle struct {
radius float64
}
type shape interface {
area() float64
}
// methods
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func (s square) area() float64 {
return s.length * s.length
}
func main() {
c := circle{
radius: 2.5,
}
s := square{
length: 25.5,
}
info(c)
info(s)
}
func info(s shape) {
x := s.area()
fmt.Println(x)
}
все это работает, как и ожидалось, однако я не до конца понимаю, почему. Я понимаю, что происходит с точки зрения создания интерфейса со структурами, однако меня смущает то, как мы под func main()
после создания литералов типа circle
и square
, когда я передаю аргументы info(c)
и info(s)
как Go понимает, какой метод мы вызываем с правильным аргументом. Я чувствую, что может потребоваться какое-то утверждение типа, связанное с:
func info(s shape) {
if s.(type) == circle {
c.area()
}
}
Go знает, что форма типа будет либо кругом, либо квадратом, а затем на заднем плане будет Go делать этот тип выбора для нас? Надеюсь, мой вопрос был достаточно ясен, спасибо.