Kurzusok
/
Go
Go
/
Feladatok
/
Rendezőterem
Rendezőterem

Rendezőterem

Tanulófeladat

Bevezetés

Típuskonverzió

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)

Primitív típusok és stringek közötti konverzió

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)

Típusállítások

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.

Típusváltások

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)
}

Utasítások

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.

1. Egyszerű számok leírása

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

2. Egy számdoboz leírása

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

3. Valósíts meg egy metódust, amely kinyeri a számot egy díszes számdobozból

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

4. Egy díszes számdoboz leírása

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!

5. Valósítsd meg a DescribeAnything függvényt, amely mindegyiket használja

Ez 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:

  • az int és a float64 is a DescribeNumber függvényre delegáljon
  • a NumberBox a DescribeNumberBox függvényre delegáljon
  • a FancyNumberBox a DescribeFancyNumberBox függvényre delegáljon
  • bármi más esetén "Return to sender" legyen az eredmény
fmt.Println(DescribeAnything(numberBoxContaining{12.345}))
// Output: This is a box containing the number 12.3
fmt.Println(DescribeAnything("some string"))
// Output: Return to sender
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Go Exercism

Készen állsz elkezdeni a(z) Rendezőterem feladatot?

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.