Technologique
663 subscribers
144 photos
3 videos
42 files
949 links
Deeply involved developers about various aspects, tendencies & conceptions of programming technologies, FLOSS, Linux, security, cloud infrastructures & DevOps practices, distributed systems, data warehousing & analysis, DL/ML, web3, etc.
Author: @andrcmdr
Download Telegram
#Generics in Go

Pass interfaces

Generic functions can easily be written - this require the caller to use variables of the empty interface type. The empty interface can hold a value of any type.


package main

import "fmt"

func swap(a, b *interface{}) {
*a, *b = *b, *a
}

func main() {
var a, b interface{} = 3, "four"
fmt.Println(a, b)
swap(&a, &b)
fmt.Println(a, b)
}


Output:

3 four
four 3


В интернетах только и разговоров, что об отсутствии дженериков в Go...
В Go нет дженериков?
Зато есть ещё более шикарный хак!
Обобщённые типы для функций/методов и их параметров могут создаваться через пустые интерфейсы, которые могут содержать значения любого типа.
При этом параметры в обобщённую функцию передаются по ссылке, интерфейсы передаются через указатели и все операции с интерфейсами и параметрами происходят через указатели.
Таким образом вся реализация дженериков сводится к операциям через указатели с переменными, тип которых определён пустыми интерфейсами, т.е. всё сводится к операциям с интерфейсами!

Интерфейсы и модули - это сила структурного программирования!
Опубликованы результаты исследования сообщества пользователей Go на основе проведённого в декабре прошлого года опроса. В ноябре прошлого года проекту языка Go исполнилось семь лет.

https://blog.golang.org/survey2016-results

Из исследования видно шаблонное мышление массы участников и что информация об изменениях, нововведениях и токостях работы языка и компилятора Go не достигает пользователей языка - люди по прежнему хотят дженерики, контроль зависимостей и IDE, когда в Go это всё есть (generics, Gogland IDE) и многое даже было изначально (модульность и контроль зависимостей, через go build).

Чего действительно не хватает в Go так это единой и стройной экосистемы/инфраструктуры/репозитория пакетов и документации (однако, есть go doc и https://godoc.org), и хорошего пакетного менеджера в Tools языка (однако, есть go get, go install, go list), тесно интегрированного с Git и GitHub, и Go Tools (go fmt, import correction).

Менеджеров пакетов очень много:
https://github.com/golang/go/wiki/PackageManagementTools
Есть нативные встроенные возможности Go Tools (go get, go install, go list, go build):
https://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies
https://golang.org/cmd/go/
https://golang.org/cmd/
https://golang.org/doc/cmd
https://golang.org/doc/