A Go-ban a különböző típusok közötti átalakítást explicit módon kell elvégezni.
A típusok közötti átalakítás (más néven típusátalakítás) egy olyan függvénnyel történik, amelynek a neve a cél típus neve.
Például egy int típus float64-té alakításához a következőt kell tenned:
var x int = 42 // x has type int
f := float64(x) // f has type float64 (ie. 42.0)
Létezik egy strconv csomag a primitív típusok (például int) és a string közötti konverzióhoz.
import "strconv"
var intString string = "42"
var i, err = strconv.Atoi(intString)
var number int = 12
var s string = strconv.Itoa(number)
A Go-ban az interfészek kétértelműséget okozhatnak a mögöttes típussal kapcsolatban.
A típusállítás lehetővé teszi, hogy kinyerjük az interfész érték mögöttes konkrét értékét a következő szintaxissal: interfaceVariable.(concreteType).
Például:
var input any = 12
number := input.(int)
MEGJEGYZÉS: ez pánikot okoz, ha az interfész változó nem a konkrét típus értékét tartalmazza.
Tesztelhetjük, hogy egy interfész érték egy adott konkrét típust tartalmaz-e, ha kihasználjuk a típusállítás mindkét visszatérési értékét: a mögöttes értéket és egy boolean értéket, amely jelzi, hogy az állítás sikeres volt-e. Például:
str, ok := input.(string) // no panic if input is not a string
Ha az input egy string értéket tartalmaz, akkor a str lesz a mögöttes érték, és az ok igaz lesz.
Ha az input nem tartalmaz string értéket, akkor a str a string típus zéró értéke lesz (azaz "" - az üres string), és az ok hamis lesz.
Egyik esetben sem lép fel pánik.
A típusváltás több típusállítást tud egymás után végrehajtani.
Ugyanaz a szintaxisa, mint egy típusállításnak (interfaceVariable.(concreteType)), de a concreteType helyére a type kulcsszó kerül.
Íme egy példa:
var i any = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}
switch v := i.(type) {
case int:
fmt.Printf("the integer %d\n", v)
case string:
fmt.Printf("the string %s\n", v)
default:
fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}
Jen egy nagy gyár válogatótermében dolgozik. A válogatóteremnek mindent fel kell dolgoznia, ami bekerül oda, méghozzá úgy, hogy címkével látja el. Jen azokért a dolgokért felel, amelyeket előre számként kategorizáltak, és egy programra van szüksége, amely segít neki a válogatásban.
A legtöbb primitív érték egyszerű címkét kap.
A számoknál olyan stringeket szeretne, amelyek azt mondják, hogy "This is the number 2.0" (ha a szám 2 volt).
Jen ugyanilyen kimenetet szeretne az egész számoknál és a tizedes törteknél is.
Van néhány Box interfész, amelyeket ki kell bontani, hogy hozzájussunk a tartalmukhoz.
Egy NumberBox esetén olyan stringeket szeretne, amelyek azt mondják, hogy "This is a box containing the number 3.0" (ha a Number() metódus 3-at ad vissza).
Egy FancyNumberBox esetén olyan stringeket szeretne, amelyek azt mondják, hogy "This is a fancy box containing the number 4.0", de csak akkor, ha a típus FancyNumber.
Bármi váratlan esetén "Return to sender" legyen a válasz, hogy Jen visszaküldhesse őket oda, ahonnan jöttek.
Jen szeretné, ha a számok olyan stringeket adnának vissza, mint a "This is the number 2.0" (egy tizedesjegyet is beleértve):
fmt.Println(DescribeNumber(-12.345))
// Output: This is the number -12.3
Jen szeretné, ha a számdobozok olyan stringeket adnának vissza, mint a "This is a box containing the number 2.0" (itt is egy tizedesjegyet is beleértve):
fmt.Println(DescribeNumberBox(numberBoxContaining{12}))
// Output: This is a box containing the number 12.0
Jennek szüksége van egy segédfüggvényre, amely kinyeri a számot egy FancyNumberBox-ból.
Ha a FancyNumberBox egy FancyNumber, akkor nyerd ki az értékét, és alakítsd át string-ből int-té.
Bármely más típusú FancyNumberBox esetén 0-t kell visszaadni.
fmt.Println(ExtractFancyNumber(FancyNumber{"10"}))
// Output: 10
fmt.Println(ExtractFancyNumber(AnotherFancyNumber{"4"}))
// Output: 0
Ha a FancyNumberBox egy FancyNumber, akkor Jen olyan stringeket szeretne, amelyek azt mondják, hogy "This is a fancy box containing the number 4.0".
Bármely más típusú FancyNumberBox esetén "This is a fancy box containing the number 0.0" legyen a válasz.
fmt.Println(DescribeFancyNumberBox(FancyNumber{"10"}))
// Output: This is a fancy box containing the number 10.0
fmt.Println(DescribeFancyNumberBox(AnotherFancyNumber{"4"}))
// Output: This is a fancy box containing the number 0.0
Megjegyzés: használnunk kell az ExtractFancyNumber függvényt!
DescribeAnything függvényt, amely mindegyiket használjaEz az a fő függvény, amelyre Jennek szüksége van, és amely bármilyen bemenetet elfogad.
A DescribeAnything a kapott érték típusa alapján delegálja a munkát a többi függvénynek.
Pontosabban:
int és a float64 is a DescribeNumber függvényre delegáljonNumberBox a DescribeNumberBox függvényre delegáljonFancyNumberBox a DescribeFancyNumberBox függvényre delegáljon"Return to sender" legyen az eredményfmt.Println(DescribeAnything(numberBoxContaining{12.345}))
// Output: This is a box containing the number 12.3
fmt.Println(DescribeAnything("some string"))
// Output: Return to sender
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.