Go (програмски језик) — разлика између измена

Садржај обрисан Садржај додат
м ++ типови података
Нема описа измене
Ред 81:
=== Типови података ===
 
==== Уграђени типови ====
Гоу има одређен број уграђених типова података, укључујући [[Булов тип података]], нумеричке типове ({{mono|byte}}, {{mono|rune}}, {{mono|int}}, {{mono|float}}, {{mono|complex}}), и [[ниска|ниске]]. Ниске су непроменљиве, а помоћу уграђених оператора и кључних речи могуће је спајање, поређење и кодирање из и у [[UTF-8]]. Сложени типови ({{јез-енг|record type}}) се могу дефинисати уз помоћ кључне речи {{mono|struct}}.
 
==== Низови и одсечци ====
Типом податка {{mono|T}} и бројем елемената {{mono|n}} се дефинише [[Низ (структура података)|низ]] означен са {{mono|[n]T}}; пошто је број елемената део типа податка, низови којима су типови елемената исти али им је број елемената различит, су различитог типа. [[Динамички низ]]ови се зову ''одсечци'' {{јез-енг|slice}}; за тип податка {{mono|T}}, одсечак се означава са {{mono|[]T}}. Ови низови имају дужину и капацитет којим се означава када треба заузети нови део меморије за проширење одсечка. Неколико одсечака може да дели одређени меморијски простор.
 
==== Мапе ====
За пар типова података {{mono|K, V}}, тип {{mono|map[K]V}} означава тип [[Хеш табела|хеш табеле]] која мапира кључеве типа {{mono|K}} на вредности типа {{mono|V}}. Хеш табеле су уграђене у језик, имају посебну синтаксу, и над њима се операције врше уграђеним функцијама.
 
==== Канали ====
Канали ({{јез-енг|channel}}) за комуникацију између конкурентских процеса такође имају своју синтаксу. За тип податка {{mono|T}}, тип канала се означава са {{mono|chan T}}.
 
==== Показивачи ====
[[Показивач (програмирање)|Показивачи]] постоје за све типове података; за тип {{mono|T}}, показивач се означава са {{mono|*T}}. За разлику од C-а, нема показивачке аритметике, осим кроз тип {{mono|Pointer}} из пакета {{mono|unsafe}} у стандардној библиотеци.
 
==== Систем ====
Поред подршке за интерфејсе, систем типова је ''номиналан''. Кључна реч {{mono|type}} ствара нови ''именован тип податка'', који се разликује од осталих типова података који могу имати исти распоред у меморији (у случају {{mono|struct}} типа, и исти редослед поља). Неке конверзије између типова су уграђене, а додавање новог типа се могу дефинисати додатне конверзије. Конверзије између типова су увек експлицитне.
 
На пример, помоћу кључне речи {{mono|type}} се може дефинисати тип за [[IP адреса|IPv4]] адресе, које су 32-битни цели бројеви без предзнака:
 
<syntaxhighlight lang="go">
type ipv4addr uint32
</syntaxhighlight>
 
Са овом дефиницијом типа {{mono|ipv4addr(x)}} интерпретира {{mono|uint32}} вредност у ИП адресу. Просто додељивање вредности {{mono|x}} променљивој чији је тип {{mono|ipv4addr}} није могуће јер, иако имају исту структуру у меморији, нису исти типови.
 
Константни изрази могу имати или немати типове; ако немају тип податка, он им се додељује када се њихова вредност додели некој променљивој, под условом да је конверзија могућа током компилације.
 
Функције такође имају типове. Могу да примају нула или више аргумената и да врате нула или више вредности; све ове вредности имају своје типове, а заједно они одређују тип функције. На пример, {{mono|func(string, int32) (bool, error)}} је тип функције која као аргументе прима текст и 32-битни број са предзнаком (редом, {{mono|string}} и {{mono|int32}}), а враћа [[Булов тип података|бул]] и грешку (редом, {{mono|bool}} и {{mono|error}}).
 
Сваки именовани тип може имати сет метода који је са њим повезан. Претходни пример се може проширити тако да има методе којим се врши штампање у читљивом формату, проверава да ли се налази у одређеном опсегу и слично. Типу се метода додаје тако што се између кључне речи {{mono|func}} и имена функције дода прималац ({{јез-енг|receiver}}), који се састоји од имена које представља референцу (слично речима {{mono|this}} и {{mono|self}} у језицима као што су [[Јава (програмски језик)|Јава}} [[Пајтон (програмски језик)|Пајтон]]) и типа на који се метода односи.
 
<syntaxhighlight lang="go">
// Is this the zero broadcast address 255.255.255.255?
func (addr ipv4addr) ZeroBroadcast() bool {
return addr == 0xFFFFFFFF
}
</syntaxhighlight>
 
Линија 111 ⟶ 132:
 
func main() {
fmt.Println("Здраво свете!")
}
</syntaxhighlight>