GO interface parameter
почему interface в GO не поддержавает параметры, и как обходить ето если нужно зделать независемый модуль / функцию который использует параметры абстрактной структуры
пример из TypeScript
interface Point {
x: number
y: number
}
function PointStuff(point: Point){
// ...
}
class Point3D {
x: number = 1
y: number = 1
z: number = 1
}
const point3D = new Point3D()
PointStuff(point3D)
Ответы (1 шт):
Что значит "не поддерживает параметры"?
Что именно вы хотите добиться? Вот как ваш TS код может быть написан на Go:
package main
import "fmt"
// Это спецификатор типа - для красоты и общности, типа `number` из TS.
type Number interface {
~int8 | ~int16 | ~int32 | ~int64 | ~float32 | ~float64
}
type Point2d[T Number] interface {
X() T
Y() T
}
func PointStuff[T Number](point Point2d[T]) {
fmt.Printf("Point 2d: (%v, %v)\n", point.X(), point.Y())
}
// Переменные поименованы маленькими буквами чтобы их нельзя было изменить
// при использовании типа в других пакетах
type Point3d struct {
x float64
y float64
z float64
}
func (p Point3d) X() float64 {
return p.x
}
func (p Point3d) Y() float64 {
return p.y
}
func (p Point3d) Z() float64 {
return p.z
}
func NewPoint3d(x, y, z float64) Point3d {
return Point3d{
x: x,
y: y,
z: z,
}
}
func main() {
p := NewPoint3d(1.0, 2.0, 3.0)
PointStuff[float64](p)
}
Интерфейс в Go - это именно интерфейс, то есть соглашение об именовании функций. Он не имеет полей, так как конкретный способ хранения данных зависит от конкретного типа, который реализует интерфейс.
Если вам хочется внести в интерфейс данные, ударьте себя по рукам линейкой. И напишите вместо данных геттер - как в примере выше функции X() и Y(). Если хотите, чтобы данные объекта можно было изменять, ещё раз как следует подумайте. Возможность менять поля объекта произвольным образом - это довольно дурной стиль (ИМХО), который может легко привести к проблемам. ИМХО, гораздо лучше добавить специальные методы, такие как сложение/вычитание точек (векторов) и умножение на скаляр. Если же очень нужно, то лучше сделайте отдельный интерфейс MutablePoint с сеттерами.