У меня вопрос: можно ли задать интерфейс для линейного пространства?
Напомню, что в линейном пространстве L есть операция сложения элементов и умножения элемента на число. При этом выполняются два свойства:
1)а+б в л
2)ak в L, где k - скаляр
Я представил интерфейс для линейного пространства в следующем виде:
type Point interface {
}
type LinSpace interface {
Sum(x, y Point)
Prod(x Point, k float64)
}
как я могу учесть два вышеуказанных свойства в определении интерфейса?
Я использовал это как вымышленный пример интерфейса, реальной пользы от него нет. Мне стало интересно, можно ли как-то наложить на интерфейс свойства, а не только определения методов.
Похоже, вы не упомянули какие-либо свойства (за исключением того, что эти два метода должны существовать, что является нормальным использованием интерфейсов). Вы имеете в виду, что существует какое-то конкретное математическое соотношение, которому должен удовлетворять интерфейс? Если это так, вы не можете применить это с помощью системы типов Go.
Интерфейсы не могут иметь полей. У них могут быть только методы. Если необходимо, добавьте геттеры и сеттеры. Или используйте тип структуры вместо типа интерфейса.

Интерфейсы могут содержать только методы.
Вы можете сделать что-то вроде этого:
// Effective Go says: interface names should contain prefix -er
type LinSpacer interface {
Sum() float64
Prod(k float64) float64
}
// Struct that implements interface
type LinSpaceImpl struct {
A float64
B float64
}
// Implementation of Sum() method
// Also, You don't need to pass A and B vars
// because they're already exist in LinSpaceImpl
func (l *LinSpaceImpl) Sum() float64 {
return l.A + l.B
}
// Implementation of Prod() method
// Unlike the Sum() method, here we need extra param - k
// So it has to be passed, or You can add it to
// LinSpaceImpl as another fields but it doesn't
// make any sense though
func (l *LinSpaceImpl) Prod(k float64) float64 {
return l.A * k
}
// Unnecessary "constructor" to optimize Your main function
// And clarify code
func NewLinSpace(a, b float64) LinSpacer {
// Since LinSpaceImpl correctly implements LinSpacer interface
// You can return instance of LinSpaceImpl as LinSpacer
return &LinSpaceImpl{
A: a,
B: b,
}
}
И тогда вы можете сделать это в своей основной (или другой) функции:
// Use any float values
ls := NewLinSpace(11.2, 24.7)
fmt.Println(ls.Sum()) // 35.9
fmt.Println(ls.Prod(30.2)) // 338.23999999999995
Вот как работает «ООП» в Go.
Можете ли вы показать пример того, как вы хотели бы использовать интерфейс?