Generické programovanie v Go

Saturday, Aug 1, 2020 by Nelo

Generické programovanie je štýl písania algoritmov alebo typov, v ktorom nie sú typy definované priamo, ale budú určené neskôr (pri kompilácii - C++/Rust alebo za behu programu - Python/TypeScript) v časti kódu volajúceho generický algoritmus.

To umožňuje výrazne zvýšiť znovupoužiteľnosť kódu a redukovať duplicity a tým aj chyby. Typický use case sú napríklad generické algoritmy Map, Reduce, Filter, alebo generický typ (container) Node v binárnom strome.

V novej verzii Go sa uvažuje pridať formu parametrického polymorfizmu. Nešpecifikovný parameter sa nazýva type parameter a píše sa v zátvorke za názvom funkcie (riadok 6 v príklade nižšie) s kľúčovým slovom type. Pri volaní funkcie s typovým parametrom sa zmení na konkrétny type argument opäť písaný v zátvorke za názvom volajúcej funkcie (riadok 15-16 v príklade nižšie). Zvažuje sa taktiež dedukcia typov (riadok 17 v príklade nižšie). V návrhu sa okrem iného zvažuje, aký ASCII znak použiť, okrúhlu alebo hranatú zátvorku.

Dizajn v Go oproti C++ v návrhu nepodporuje metaprogramovanie ako C++, alebo akúkoľvek formu generovania kódu počas kompilácie, ani type erasure ako Java. Dôvody môžete zistiť v referenciách. Podporuje však napríklad generické funkcie pracujúce s generickými typmi (príklad: func (m *Map(K, V)) Find(k K) (V, bool)).

Generický program v Go

Zdrojový kód si môžete vyskúšať na Go 2 Playground.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
	"fmt"
)

func Print[type T](s []T) {
	for _, v := range s {
		fmt.Print(v)
	}
}

func main() {
	s := []string{"Hello, ", "playground\n"}
	Print[string](s)
	Print(string)(s)
	Print(s)
	Print([]int{4, 2})
	//Print[int](s)
}

Referencie

Vaše otázky, návrhy a komentáre

Verím, že vás tento návod inšpiroval a budem vďačný ak dáte spätnú väzbu a pomôže mi zamerať sa na to čo by vás zaujímalo.

TAK ČO HOVORÍŠ ?

Kontaktuj nás ak potrebuješ pomoc, veľmi radi pomôžeme.

Kontaktuj nás