В чем смысл объявления этого типа?

На самом деле я изучаю golang (из .NET), и есть одна вещь, которую я не понимаю в этом языке. Иногда я встречаю такое объявление:

https://github.com/golang/crypto/blob/master/ed25519/ed25519.go

// PublicKey is the type of Ed25519 public keys.
type PublicKey []byte

Что это значит? Это создание структуры, наследуемой от []byte?

Это просто псевдоним?

Я думал, что голанг запрещает наследование.


person Hisko    schedule 21.03.2018    source источник
comment
вы должны начать с Effective Go. получить представление о работе с go.   -  person Himanshu    schedule 21.03.2018
comment
Он определяет новый именованный тип PublicKey, который представляет собой байтовый срез. Это не структура (здесь нет ключевого слова struct), не наследование и не псевдоним типа (что совершенно другое). Это скорее полная противоположность наследованию: после type X Y тип X имеет структуру памяти Y, но ни один из методов Y. И сначала пройдите Tour of Go.   -  person Volker    schedule 21.03.2018


Ответы (1)


Это объявление типа, точнее определение типа. Он создает новый тип, используя []byte в качестве базового типа:

Определение типа создает новый отдельный тип с тем же базовым типом и операциями, что и данный тип, и привязывает к нему идентификатор.

Новые типы создаются, потому что они могут упростить многократное их использование, их идентификатор (их имя) может быть выразительным в других контекстах и, что наиболее важно, чтобы вы могли определять (прикреплять) к нему методы (вы не можете прикреплять методы к встроенные типы, а также анонимные типы или типы, определенные в других пакетах).

Эта последняя часть (присоединение методов) важна, потому что хотя вместо присоединения методов вы могли бы так же легко создавать и использовать функции, которые принимают «исходный» тип в качестве параметра, только типы с методами могут реализовывать интерфейсы, которые перечисляют («предписывают») эти методы, и, как упоминалось ранее, вы не можете присоединять методы к определенным типам, пока не создадите новый производный от них тип.

Например, тип []int никогда не будет реализовывать sort.Interface, необходимый для сортировки (по sort package), поэтому создается новый тип sort.IntSlice (то есть type IntSlice []int), для которого нужные методы прикреплены, поэтому вы можете передать значение типа sort.IntSlice в функцию sort.Sort(), но не значение типа []int. Поскольку sort.IntSlice имеет базовый тип []int, если у вас есть значение []int, вы можете просто преобразовать его на sort.IntSlice, если вы хотите отсортировать его, как в этом примере (попробуйте на Go Playground ):

is := []int{1,3,2}
sort.Sort(sort.IntSlice(is))
fmt.Println(is) // Prints: [1 2 3]

Когда вы создаете новый тип, «наследование» не происходит. Новый тип будет иметь 0 методов. Если вам нужна функциональность, похожая на наследование, вам следует проверить встраивание (в отношении типов структур ), и в этом случае тип внедрения также будет «иметь» методы встроенного типа.

person icza    schedule 21.03.2018