Вы не можете принудительно настроить набор конкретных типов во время компиляции так, как вам бы хотелось.
Что вы можете сделать, это использовать интерфейсы. Перечислите методы в интерфейсе, которые вы ожидаете от реализаций. Тогда не имеет значения, какой конкретно тип среды выполнения. Вы взаимодействуете со значением только через интерфейс, который гарантируется во время компиляции, что оно реализуется переданным значением.
Например, если вы ожидаете, что значение предоставит значение int32
, используйте этот интерфейс:
type HasInt32 interface {
Int32() int32
}
func f(i HasInt32) {
fmt.Println("int32 value:", i.Int32())
}
Не имеет значения, имеет ли переданное значение int32
или float64
в качестве базового типа, или это любой другой сложный тип. Вам нужен int32
, и это то, что вы получаете. Разработчики несут ответственность за то, как получить это значение.
Например:
type MyInt32 int32
func (m MyInt32) Int32() int32 { return int32(m) }
type MyStruct struct {
i int64
}
func (m MyStruct) Int32() int32 { return int32(m.i) }
Тестирование:
var m MyInt32 = 1
f(m)
var s MyStruct = MyStruct{i: 2}
f(s)
Какие выходы (попробуйте на Go Детская площадка ):
int32 value: 1
int32 value: 2