Direct naar de hoofdinhoud
Module 1 · Les 2 van 52/50 in de cursus~10 min
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

CategorieTypNulwaarde
Numeriekint, int64, float32, float64, uint, ...0
Booleaansboolfalse
Tekenreeksstring"" (lege tekenreeks)
Aanwijzer*Tnil
Segment / kaart / kanaal[]T, map[K]V, chan Tnil
Functie / Interfacefunc(...), interface{...}nil
StructuurT struct{...}alle velden op nulwaarde
Go
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.

Go
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.

Go
var a int = 10
var b int64 = int64(a)  // obbligatorio

Conversie tussen cijfers: let op voor afkapping

Van float64 naar int kapt af naar nul, dit gebeurt niet rond:

Go
f := 3.9
i := int(f)   // 3, non 4
n := int(-3.9) // -3, non -4

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

Go
import "strconv"

s := strconv.Itoa(42)        // "42"
n, err := strconv.Atoi("42") // 42, nil

We zullen er uitgebreid op ingaan in de Stdlib-module.

Jouw beurt

Oefening#go.m1.l2.e1
Pogingen: 0Laden…

Declareer een variabele teller van het type int zonder deze te initialiseren en druk deze af. Verwacht: 0.

Editor laden…
Toon hint

Zonder initialisator neemt de variabele de nulwaarde van het type aan.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m1.l2.e2
Pogingen: 0Laden…

Gegeven het gehele getal n=10, converteer n naar float64 en deel door 4. Druk het resultaat af (verwacht 2,5).

Editor laden…
Toon hint

Zonder de expliciete conversie is `n/4` een deling van gehele getallen die 2 oplevert.

Oplossing beschikbaar na 3 pogingen

Quiz#go.m1.l2.e3
Klaar

Wat drukt deze code af?

Go
f := 3.7
fmt.Println(int(f))
Antwoordmogelijkheden

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 gebruik math.Round.
  • Gebruik voor string ↔ nummer het pakket strconv (NIET een directe cast).