Могу ли я создать псевдоним типа в 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).