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 шт):

Автор решения: Pak Uula

Что значит "не поддерживает параметры"?

Что именно вы хотите добиться? Вот как ваш 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 с сеттерами.

→ Ссылка