Go-ban a for és egy index segítségével is végigmehetsz egy slice elemein, de használhatod a range-et is.
A range segítségével egy map elemein is végigmehetsz.
Minden iteráció két értéket ad vissza: az indexet/kulcsot és az adott indexen/kulcson lévő elem egy másolatát.
Gyerekjáték: a ciklus a slice elemein a várt sorrendben megy végig.
xi := []int{10, 20, 30}
for i, x := range xi {
fmt.Println(i, x)
}
// outputs:
// 0, 10
// 1, 20
// 2, 30
A map elemein való iterálás új problémát vet fel. A sorrend most véletlenszerű.
hash := map[int]int{9: 10, 99: 20, 999: 30}
for k, v := range hash {
fmt.Println(k, v)
}
// outputs, for example:
// 99 20
// 999 30
// 9 10
Első ránézésre úgy tűnhet, hogy a fenti kimenet hibás, hiszen az ember arra számítana, hogy a map deklarálásakor elsőként megadott kulcs/érték pár, a 9 10, jelenik meg először a kimenetben, nem pedig utolsóként.
A map-ek azonban természetüknél fogva rendezetlenek: nincs sem első, sem utolsó kulcs/érték pár.
Emiatt amikor egy map bejegyzésein iterálsz, a bejegyzések bejárási sorrendje véletlenszerű lesz, és nem követ semmilyen meghatározott mintát.
Ez azt jelenti, hogy a fenti kimenet lehetséges, de eltérhet attól, amit te kapsz, ha magad is lefuttatod a kódot.
Ha többet szeretnél megtudni erről, nézd meg a Go Language Spec: range clause oldalt.
Go-ban a fel nem használt változó fordítási időben hibát okoz. Néha csak az értékre van szükséged, ahogy az első példában is:
xi := []int{10, 20, 30}
for i, x := range xi {
fmt.Println(x)
}
// Go build failed: i declared but not used
Az i helyére _-t írhatsz, ami megmondja a fordítónak, hogy nem használjuk azt az értéket:
xi := []int{10, 20, 30}
for _, x := range xi {
fmt.Println(x)
}
// outputs:
// 10
// 20
// 30
Ha csak az indexet szeretnéd kiírni, az x helyére _-t tehetsz,
vagy egyszerűen elhagyhatod a deklarációt:
xi := []int{10, 20, 30}
// for i, _ := range xi {
for i := range xi {
fmt.Println(i)
}
// outputs:
// 0
// 1
// 2
A típusdefiníció egy új, nevesített típust hoz létre, amely minden más típustól különbözik, még az ugyanolyan mögöttes típusútól is.
type File []bool
A File itt a sakktábla egyetlen függőleges oszlopára utal, amelyet általában A-tól H-ig jelölnek.
Ebben az oszlopban minden mezőt egy Boolean érték képvisel, amely azt jelöli, hogy foglalt-e vagy sem.
Most, hogy a File definiálva van, más definíciókban is felhasználhatjuk:
type Chessboard map[string]File
board := Chessboard{
"A": File{true, false, true},
"B": File{false, true, false},
}
A Chessboard az oszlopazonosítókat File értékekhez rendeli.
Minden File egy Boolean-okból álló slice, amely egy sakk-oszlop mezőit képviseli.
Ezen típusdefiníciók nélkül a board egy map[string][]bool lenne, ami megnehezítené annak megértését, hogy mit is képviselünk.
Sakkrajongóként szeretnéd megírni a játék saját változatát. Persze, már rengeteg sakkimplementáció elérhető online, de a tiéd egyedi lesz!
A sakktábla minden mezőjét egy betű-szám pár azonosítja:
A B C D E F G H
8 # _ _ _ # _ _ # 8
7 _ _ _ _ _ _ _ _ 7
6 _ _ _ _ # _ _ # 6
5 _ # _ _ _ _ _ # 5
4 _ _ _ _ _ _ # # 4
3 # _ # _ _ _ _ # 3
2 _ _ _ _ _ _ _ # 2
1 # _ _ _ _ _ _ # 1
A B C D E F G H
Valósítsd meg a CountInFile(board Chessboard, file string) int függvényt.
A függvény számolja meg a foglalt mezők teljes számát úgy, hogy végigmegy egy mapen.
Adjon vissza egy egész számot.
Ha a megadott vonal nem található a mapben, adjon vissza nullát (0).
CountInFile(board, "A")
// => 3
Valósítsd meg a CountInRank(board Chessboard, rank int) int függvényt.
A függvény számolja meg a foglalt mezők teljes számát úgy, hogy végigmegy a megadott soron.
Adjon vissza egy egész számot.
Ha a megadott sor nem érvényes (nem 1 és 8 között van, a határokat is beleértve), adjon vissza nullát (0).
CountInRank(board, 2)
// => 1
Valósítsd meg a CountAll(board Chessboard) int függvényt.
A függvény számolja meg, hány mező van a sakktáblán, és adjon vissza egy egész számot.
Mivel nem kell ellenőrizned a mezők tartalmát, érdemes lehet a range utasítást úgy használni, hogy az index-et és a value-t is elhagyod.
CountAll(board)
// => 64
Valósítsd meg a CountOccupied(board Chessboard) int függvényt.
A függvény számolja meg, hány mező foglalt a sakktáblán.
Adjon vissza egy egész számot.
CountOccupied(board)
// => 15
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom166 feladat segítségével, valódi emberi mentorálással, mindez ingyen.