niedziela, stycznia 30, 2011

Go dla Java'owca ;-) odcinek 2 "kontenery dwa ;-)"

Już tu kiedyś pisałem, że mam w Java'ie 2 ulubione interfejsy ;-) Map i List.
Naturalnym więc jest, że chcę ich w Go ;-)

Dziś przyjrzymy się "zastępcom" List z Java'y.

Są to List i Vector z pakietu container/list i container/vector (szczerze nie wiem jaki jest zwyczaj pisania tego w Go, bo same pakiety zwą się list i vector).

Zacznijmy od Vector, bo ma fajne ficzery :-)

 v:=new(vector.StringVector)
v.Push("test1")
v.Push("test2")
v.Push("test3")
v.Do(func(elem string) {
fmt.Printf(elem+"\n")
})


Ten kawałek kodu wkłada najpierw łańcuchy test1, test2 i test3 do wektora, a później je wypisuje przy pomocy metody Do(func(elem string)).
Sumowanie liczb staje się dużo prostsze dzięki tej metodzie ;-)

 iV:=new(vector.IntVector)
iV.Push(1)
iV.Push(2)
iV.Push(3)
sum:=0
iV.Do(func(elem int) {sum+=elem})
fmt.Printf("sum=%d\n",sum)


Jest też sam Vector, w którym można trzymać wszystkie typy obiektów.
Z wektorami można robić różne różności, od kasowania elementów, przez wycinanie elementów, zmienianie rozmiaru kontenera i podobne. Standard.
Sam miałem największe problemy z załapaniem jak się do wektorów coś wkłada i z nich wyjmuje (chociaż to miałem w przypadku list, bo wektorów wtedy jeszcze nie próbowałem ;-))

Sam Vector to odpowiednik Java'owego List (czy jeśli chcemy klasy konkretnej to ArrayList no i oczywiście Vector'a, którego w Java'ie już się nie powinno używać, bo synchronizacja nam jest zwykle niepotrzebna).

Teraz kolej na List w Go.
Jest to lista dwukierunkowa, której najbliższym krewnym w Java'ie jest LinkedList.
Możemy w niej wkładać elementy na koniec przy pomocy metody PushBack, na początek przy pomocy PushFront, oraz "między" istniejące elementy, tak by nasz nowo włożony znajdował się przed znacznikiem (InsertBefore) albo za znacznikiem (InsertAfter). Możemy też oczywiście iterować przy użyciu metod Next() i Prev().

By przejść od początku do końca takiej listy używamy kod (z dokumentacji Go :)):

for e := l.Front(); e != nil; e = e.Next() {
// do something with e.Value
}


By to samo zrobić od tyłu do przodu użyjemy kodu:
for e := l.Back(); e != nil; e = e.Prev() {
// do something with e.Value
}


I to by było na tyle ;-)


Podobne postybeta
Ściana, czyli rozbijam się na onclick ;-)
Go dla Java'owca ;-) odcinek 1 "klasy"
Język Go dla Windows :-)
Uspokajacz
Goto Go ;-)