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
Korábban már láttad, hogyan lehet struct típusokat definiálni. Nem struct típusokat is definiálhatsz, amelyeket beépített típusdeklaráció álneveként használhatsz, és receiver függvényeket is definiálhatsz rajtuk, hogy ugyanúgy ki tudd őket egészíteni, mint a struct típusokat.
type Name string
func SayHello(n Name) {
fmt.Printf("Hello %s\n", n)
}
n := Name("Fred")
SayHello(n)
// Output: Hello Fred
Olyan nem struct típusokat is definiálhatsz, amelyek tömbökből és map-ekből állnak.
type Names []string
func SayHello(n Names) {
for _, name := range n {
fmt.Printf("Hello %s\n", name)
}
}
n := Names([]string{"Fred", "Bill"})
SayHello(n)
// Output:
// Hello Fred
// Hello Bill
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 fogalom165 feladat segítségével, valódi emberi mentorálással, mindez ingyen.