Могу ли я создать псевдоним типа в Golang?
Я борюсь с моим обучением Go.
Я нашел эту аккуратную реализацию набора в go:gopkg.in / fatih / set.v0, но я бы предпочел назвать свои наборы более явным именем, которое set.Set
, делать что-то вроде:
type View set.Set
в сущности, я хочу, чтобы мои View
тип наследования set.Set
'ы методов. Потому что, ну, View
это set.Set
описателей. Но я знаю, что Go довольно острый на наследство, и набирает генеральный.
на данный момент я пробовал следующее вроде наследование, но это вызывает множество ошибок при попытке использовать некоторые функции, такие как func Union(set1, set2 Interface, sets ...Interface) Interface
или func (s *Set) Merge(t Interface)
:
type View struct {
set.Set
}
Я хотел бы знать, есть ли способ достичь того, что я хочу, по-своему, или если я просто пытаюсь применить свои хорошие практики к языку, который их отбрасывает, пожалуйста.
2 ответов
Если кто-то еще возвращается к этому вопросу, начиная с Go 1.9 псевдонимы типов теперь поддерживаются.
псевдоним типа имеет вид: type T1 = T2
Так что в вашем примере вы можете просто сделать type View = set.Set
и все будет работать как вы хотите.
примечание, Я думаю, что простое сглаживание, которое вы предложили изначально, синтаксически корректно, хотя и быстро взглянув на библиотеку set, а не на сглаживание set.Set
это может иметь больше смысла для alias set.Interface
, например:
package main
import (
"fmt"
set "gopkg.in/fatih/set.v0"
)
// View is a type alias for the set.Interface interface
type View set.Interface
// Display takes one of our View types in order to print it.
func Display(view View) {
fmt.Println(view.List())
}
func main() {
// create our first set.Interface or View
v1 := set.New()
v1.Add("foo")
// create our second set.Interface or View
v2 := set.New("bar")
// call a set function
v3 := set.Union(v1, v2)
// call our function that takes a View
Display(v3)
}
возможно, вы заметили, что я как-то обманываю, потому что я не упоминаю псевдонимный тип в приведенном выше коде, кроме как при определении параметра Display
функция, над которой Вы заметите, принимает в View
экземпляр, а не set.Interface
. Если у вас есть много функций, работающих над этими вещами, это может быть более выразительно для вашего домена.
отметим, что наш View
type-это псевдоним типа интерфейса, он исключает добавление ваших собственных функций к этому типу, поскольку Go не позволяет нам иметь тип приемника интерфейса для функции (я мог бы выразить это неправильно). Под этим я подразумеваю, что вы не можете сделать ничего подобного:
func (v View) Display() string {
return v.String()
}
в резюме я думаю, что сглаживание все нормально, это может сделать внутренние API более читаемыми, и вы можете опереться на компилятор, чтобы помочь устранить определенные классы ошибок; однако это не позволяет добавлять функциональность к пользовательскому типу. Если это требуется, потребуется альтернативный подход, либо вложение, либо простая композиция (т. е. View
есть Set
).