Het type zichtbaar
Toon op de eerste regel het type van minutes met de formaatcode %T.
Een wandelclub noteert de duur van een tocht in hele minuten. In een verslag wil je diezelfde duur in uren tonen, inclusief een deel van een uur. De keuze tussen gehele en kommagetallen bepaalt of dat deel tijdens de berekening bewaard blijft.
Een type bepaalt welke soort waarde een variabele kan bevatten en welke bewerkingen daarbij horen. Met minutes := 95 leidt Go in dit geval het type int af. Met distance := 2.5 krijgt de variabele in dit geval het type float64.
int gebruik je hier voor gehele aantallen. float64 kan ook een gebroken waarde bewaren, zoals twee en een halve kilometer. In Go schrijf je in de broncode een punt als decimaalteken, ook als je in het Nederlands een komma uitspreekt.
Je kunt het type zichtbaar maken met de formaatcode %T van Printf. fmt.Printf("%T\n", minutes) toont int; met distance als argument verschijnt float64. De hoofdletter T laat het type zien, niet de actuele waarde.
package main
import "fmt"
func main() {
amount := 21
groups := 4
fmt.Println(amount / groups)
fmt.Printf("%.2f\n", float64(amount) / float64(groups))
}5 5.25
Het voorbeeld verdeelt een gemeten hoeveelheid over vier groepen. De eerste berekening gebruikt twee int-variabelen en levert daarom het aantal complete eenheden op. De tweede berekening gebruikt float64-waarden en bewaart het gebroken deel.
Een conversie maakt een waarde van een ander type. Je schrijft daarvoor de typenaam met haakjes rond de waarde, bijvoorbeeld float64(amount). Het oorspronkelijke amount wordt door dat lezen en omzetten niet gewijzigd.
Go zet variabelen met verschillende numerieke typen niet stilzwijgend naar één gezamenlijk type om. Wil je een int-variabele met een float64-variabele vermenigvuldigen, dan kies je zelf de conversie. Zo blijft in de bron zichtbaar welke vorm van rekenen je bedoelt.
Bij Printf toont %f een kommagetal in decimale vorm. Met %.2f vraag je twee cijfers na de punt. De uitvoer 5.25 is dus tekst die de berekende float64-waarde weergeeft met die gekozen precisie.
Die uitvoeropmaak verandert de variabele niet. Een andere formaattekst kan dezelfde waarde later met meer of minder cijfers laten zien. Een zichtbaar afgeronde regel is daarom iets anders dan een gewijzigde rekenwaarde.
package main
import "fmt"
func main() {
amount := 21
groups := 4
fmt.Printf("%.2f\n", float64(amount / groups))
fmt.Printf("%.2f\n", float64(amount) / float64(groups))
}5.00 5.25
In de eerste regel wordt de gehele deling al uitgevoerd voordat float64 aan de beurt komt. De uitkomst vijf wordt daarna een float64, maar het verloren kwart komt niet terug. In de tweede regel worden beide waarden vóór het delen omgezet.
Lees een samengestelde expressie daarom van binnen naar buiten. float64(amount / groups) zet de uitkomst van de deling om. float64(amount) / float64(groups) kiest eerst het type van beide waarden en voert vervolgens de deling uit.
Omgekeerd kan int(distance) van onze float64-variabele een geheel getal maken. Daarbij verdwijnt het breukdeel; Go rondt niet naar het dichtstbijzijnde gehele getal. Bij 2.5 krijg je twee, en bij een variabele met -2.5 krijg je min twee.
Gebruik dit dus alleen als het weglaten van het breukdeel bij de vraag past. De vorige les liet zien dat het aantal benodigde kratten juist naar boven moet worden berekend. Een typeconversie kiest een getalvorm en neemt die praktische beslissing niet voor je over.
De oefening gebruikt 95 minuten en een afstand van 2.5 kilometer. Toon het type van de minuten, de duur in uren met twee decimalen, het gehele deel van de afstand en ten slotte de oorspronkelijke afstand. Zo controleer je ook dat de conversie de bronwaarde behoudt.
Toon op de eerste regel het type van minutes met de formaatcode %T.
Toon op de tweede regel minutes gedeeld door 60 als een kommagetal met precies twee cijfers na de punt.
Toon op de derde regel het gehele deel van distance door de variabele naar int om te zetten.
Toon op de vierde regel de oorspronkelijke distance met Println.
De volgende les gebruikt vergelijkingen om een vraag met waar of onwaar te beantwoorden.
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.