Golang интерфейс разных типов - путаница при передаче по значению - PullRequest
0 голосов
/ 20 апреля 2020

детская площадка

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 делать этот тип выбора для нас? Надеюсь, мой вопрос был достаточно ясен, спасибо.

1 Ответ

0 голосов
/ 20 апреля 2020

Go знает, что форма типа будет либо кругом, либо квадратом

Нет. Go знает, что оба типа реализуют shape интерфейс . Это позволяет использовать экземпляры circle и square в качестве аргументов для func info(s shape).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...