Modulelessen (2/5)
Geen waarde- en typeconversies
In Go krijgt elke gedeclareerde variabele zonder expliciete waarde een
nulwaarde: de "neutrale waarde" van zijn type. Het is een enorm verschil
uit JavaScript, waarbij let x; undefined oplevert, of C, waar je eindigt
met afvalgeheugen. Geen undefined, geen UB: gewoon nul.
De nulwaardentabel
| Categorie | Typ | Nulwaarde |
|---|---|---|
| Numeriek | int, int64, float32, float64, uint, ... | 0 |
| Booleaans | bool | false |
| Tekenreeks | string | "" (lege tekenreeks) |
| Aanwijzer | *T | nil |
| Segment / kaart / kanaal | []T, map[K]V, chan T | nil |
| Functie / Interface | func(...), interface{...} | nil |
| Structuur | T struct{...} | alle velden op nulwaarde |
var i int // 0
var f float64 // 0
var s string // ""
var b bool // false
var p *int // nil
var nums []int // nil (NB: una slice nil ha len 0 e si può iterare!)Conversies zijn ALTIJD expliciet
In tegenstelling tot C, Python of JS, promoot Go er niet automatisch één
numeriek type naar een ander: u moet type(value) schrijven.
i := 42
var f float64 = float64(i)
var u uint = uint(i)Dit geldt zelfs voor "compatibele" typen zoals int en int64: een
expliciete conversie is altijd vereist.
var a int = 10
var b int64 = int64(a) // obbligatorioConversie tussen cijfers: let op voor afkapping
Van float64 naar int kapt af naar nul, dit gebeurt niet
rond:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Conversie van tekenreeks ↔ getallen
string(65) geeft NIET "65": het geeft "A" (de rune met code
punt 65). Voor string → getal en omgekeerd heb je de strconv nodig
pakket:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilWe zullen er uitgebreid op ingaan in de Stdlib-module.
Jouw beurt
Declareer een variabele teller van het type int zonder deze te initialiseren en druk deze af. Verwacht: 0.
Toon hint
Zonder initialisator neemt de variabele de nulwaarde van het type aan.
Oplossing beschikbaar na 3 pogingen
Gegeven het gehele getal n=10, converteer n naar float64 en deel door 4. Druk het resultaat af (verwacht 2,5).
Toon hint
Zonder de expliciete conversie is `n/4` een deling van gehele getallen die 2 oplevert.
Oplossing beschikbaar na 3 pogingen
Wat drukt deze code af?
f := 3.7
fmt.Println(int(f))Samenvatten
- Elk type heeft een consistente nulwaarde: geen
undefined, geen UB. - Slice/map/chan/func/interface/pointer heeft een nulwaarde
nil. - Numerieke conversies zijn altijd expliciet met
type(value). int(float)wordt afgekapt richting nul; om af te ronden gebruikmath.Round.- Gebruik voor string ↔ nummer het pakket
strconv(NIET een directe cast).