Druk uitvoer in console met Go
In dit artikel leggen we de nadruk op hoe je teksten kan laten afdrukken in de console met behulp van de print
functie in Go. Zoals in Unix en C, beidt Go ook verschillende manieren om output op het scherm of console af te drukken. Al deze functionaliteiten kunnen worden gedaan met behulp van het fmt Go pakket. Het fmt pakket bevat de I/O functies die vergelijkbaar zijn met printf
en scanf
in C. De syntax is overgenomen van C, maar de implementatie is veel eenvoudiger in Go. Lees fmt Go pakket voor meer informatie.
De meest eenvoudigste manier om hiermee te beginnen is om het println
– en printf
-functies te gebruiken:
Println voorbeeld
package main
import "fmt"
func main() {
fmt.Println("Go dev-tips is geweldig!")
}
Printf voorbeeld
import "fmt"
func main() {
stringValue := "Go dev tips!"
fmt.Printf("Hello %s",stringValue)
}
De print
functie gebruikt een standaardindeling voor elke waarde in de opgegeven volgorde. Indien iets mis is met het opgegeven formaat, een foutmelding wordt weer gegeven.
De functie fmt.Print()
is identiek aan de functie fmt.Println()
, maar er zijn twee belangrijke verschillen:
- Er worden geen nieuwe regel toegevoegd aan het einde van elke regel. Bij
Println()
is dat wel het geval. - Ruimte tussen argumenten wordt alleen toegevoegd als geen van beide een string is
Functie signatuur:
fmt.Println(a ...interface{}) (n int, err error)
package main
import "fmt"
func main() {
fmt.Print("Go dev tips ","is ","geweldig")
// resultaat -> Go dev tips is geweldig
}
In gevallen waarmee alle tekens geen string zijn, worden spaties automatisch tussen elk teken toegevoegd:
De fmt.Print()
functie kan ook gebruikt worden in plaats van fmt.println()
. Net zoals al beschreven werd in de vorige sectie is dat de fmt.Println()
functie nieuwe regels toevoegen aan het eind van elk regel. Hieronder staat een voorbeeld hiervan:
Tip: Als je maar één variabele hoeft af te drukken en je moet kiezen tussen fmt.println()
en fmt.print()
dan hang het er vanaf of je het nieuwe regelteken nodig hebt of niet.
Printf
De fmt.printf()
functie vereist een formaatspecificatie en voor elke moet je een waarde mee geven die moet overeenkomen met het data type. Met zo’n functie heb je beter controle over de opbouw, maar aan de andere kant vereist het wel meer codes.
package main
import "fmt"
func main() {
binaireWaarde := 0100
fmt.Printf("Binaire formaat: %b", binaireWaarde)
// output: Binaire formaat: 1000000
}
Formaatspecificaties
De volgende tabel illustreert de mogelijkheden voor formaatspecificatie:
formaat specificatie | Definitie |
%b | – Voor base 2 nummersysteem (binair cijfersysteem) – In het geval van floating point componenten: decimale notatie met een macht van twee (bijv.: -123456 -78) |
%c | Unicode teken, lees Generieke Unicode gebruiken in Go voor meer informatie. |
%d | Base 10 nummersysteem integer (int , int8 , int16 , int32 , int64 , uint , uint8 , uint16 , uint32 , uint64 and uintptr )– Int : gesigneerd 32 bits integer– Int8 : gesigneerd 8-bit signed integer (bereik: -128 -> 127)– Int32 : gesigneerd 32-bit integer (bereik: -2147483648 -> 2147483647)– Int64 : gesigneerd 64-bit integer (bereik: -9223372036854775808 -> 9223372036854775807)– Uint : ongesigneerde 32 bits integer– Uint8 : ongesigneerde 8-bit integer (bereik: 0 -> 255)– Uint16 : ongesigneerde 16-bit integer (bereik: 0 -> 65535)– Uint32 : ongesigneerde 32-bit integer (bereik: 0 -> 4294967295)– Uint64 : ongesigneerde 64-bit integer (bereik: 0 -> 18446744073709551615)– Uintptr : ongesigneerde 64-bit integer |
%o | Base 8 nummersysteem (bekend als Octaal) integer. Bereik: 0- 7. |
%O | Octaal met ‘0o’ prefix integer. |
%q | Eén aanhalingsteken ontsnapping teken |
%x | Base16 nummersysteem kleine letters vanaf a t/m f en hexadecimaal waardes, lees Hexadecimaal afdrukken in Go voor meer informatie. |
%X | Base 16 nummersysteem hexadecimaal in hoofdletters, lees Hexadecimaal afdrukken in Go voor meer informatie. |
%U | Unicode formaat, lees Hexadecimaal afdrukken in Go voor meer informatie. |
%e | Notatie exponent (wetenschap) (bijv.: -1.234456e+78) |
%E | Notatie exponent (wetenschap) (bijv.: -1.234456E+78) |
%f, %F | Decimaal waarde zonder exponent (floating-point). Nauwkeurigheid: – %f : standaard breedte (standaard nauwkeurigheid)– %9f : breedte 9 (met standaard nauwkeurigheid)– %.2f : standaard breedte met nauwkeurigheid van 2– %9.2f : breedte van 9 met nauwkeurigheid van 2– %9.f : breedte 9 met nauwkeurigheid van 0 |
%g | Hetzelfde als %e maar voor hogere exponenten |
%G | Hetzelfde als %E maar voor grote exponenten |
%x | Met floating point: – Hexadecimale notatie (decimale macht van twee exponenten) (e.g.: 0x1.3ep+42) Met slice of strings: – base 16 lower-case (two character per byte) |
%X | For floating point: – Upper-case hexadecimal notation decimal power of two exponent (e.g.: 0x1.3ep+42) For slices or strings: – Base 16 nummersysteem met kleine letters en twee tekens per byte. |
%s | Bytes van string slice |
%q | Escape-indeling voor dubbele aanhalingstekens |
%p | Eerste element van basis 16-annotatie met de ‘0x’ prefix. Opmerking: %b ,%d ,%o , %x en %X werk ook met pointers. De waarde wordt geformatteerd in geheel integer. |
%t | Boolean |
%v | Waarde in een standaardindeling die kan worden met: – %t – %d (‘%#x ‘ door gebruikt van ‘%#v ‘)– %g – %s – %p |
\b | Backspace (U0008 ) |
\\ | Backslash (U005c ) |
\t | Horizontaal tab teken (U0009 ) |
\n | Nieuw lijn (U000A ) |
\f | Formulierfeed (U000C ) |
\r | Carriage return (U000D ) |
\v | Verticaal tab (U000b ) |
Voorbeelden van geavanceerde indelingsspecificaties
Formaatspecificatie | Definitie | Voorbeeld |
%+d | Toon plusteken | ‘+105’ |
%<width>d | Pad met spaties (totale breedte met opvulling aan de linkerkant in het geval de waarde kleiner is dan de opgegeven breedte) | %5d -> __105 |
%-<width>d | Pad met spaties (totale breedte met opvulling aan de rechterkant in het geval de waarde kleiner is dan de opgegeven breedte) | %-5d -> 105__ |
%0<width>d | Pad met nullen op basis van de opgegeven breedte | %05d -> 00105 |
%#x | Base 16 met leidende 0x | 105 -> 0x69 |
%#U | Unicode met karakter | 105 -> U+0069 ‘i’ |
%<width>s | Totale breedte met opvulling aan de linkerkant in het geval de waarde kleiner is dan de opgegeven breedte | %8s -> “___value” |
%-<width>s | Totale breedte met opvulling aan de rechterkant in het geval de waarde kleiner is dan de opgegeven breedte | %-8s -> “value___” |
Printf fout afhandeling
Ongeldige argument
Bij gebruik van de fmt.Printf()
functie met formaatspecificatie wordt een foutmelding gegenereerd wanneer een ongeldig argument wordt opgegeven. Een voorbeeld van een dergelijk scenario is het verstrekken van een integer waar een string wordt verwacht.
Alle foutmelding begint met een string “%!” en soms door een enkel teken en eindigen met een beschrijving tussen haakjes. In dit voorbeeld verwachtte de functie een string maar kreeg een integer waarde van 24.
Ontbrekende argumenten
Wanneer een formaatspecificatie wordt opgegeven en met geen argument, wordt een ontbrekende foutoutput gegenereerd.
Te veel argumenten foutmelding
Deze foutmelding treedt op wanneer er meer argumenten zijn dan opgegeven werd aan de formaatspecificatie(s).
De foutmelding hierboven meld aan dat er extra argumenten “Dev” van het type String en “Tips” van het type string zijn opgeeft.
Niet-int breedte foutmelding
Met een formaatspecificatie kunt je ook een aangepaste breedte voor de bijbehorende string definiëren door ‘%*s
‘ te gebruiken. Een aangepaste breedte verwacht een Integer en als er geen integer wordt definieert, wordt er een BADWIDTH foutmelding gegenereerd.
Ongeldig nauwkeurigheid data type
Met een formaatspecificatie kunt je ook een aangepaste nauwkeurige waarde definiëren voor een string door de ‘%.*s
’ formaat te gebruiken. Een aangepaste nauwkeurigheid waarde moet als een Int-waarde definieert worden anders wordt een BADPREC (verkeerde precisie) foutmelding gegenereerd.
Ongeldige index foutmelding
Het definiëren van de argument index is ook toegestaan met de fmt.Printf()
functie door de ‘%*[index]d
’ te gebruiken. Een dergelijke indelingsspecificatie definieert een integer array en de index waarop de waarde moet worden opgehaald.
Wanneer een ongeldige argument index wordt opgegeven een BADINDEX-foutmelding wordt gegenereerd aangezien de index waarde niet bestaat.
Panic foutmelding
Sommige van de boven beschreven functies kunnen panic foutmelding genereren bij het optreden in ernstige omstandigheden, bijvoorbeeld wanneer de opgegeven waarde gelijk is aan nil. In het geval van een string wordt een “<nil>” weergegeven.
Println
De fmt.Println()
functie print data naar console. Bij gebruik van deze functie wordt aan het einde van elke regel een nieuwe regel automatisch toegevoegd.
Functie signatuur:
fmt.Println(...interface{}) (n int, err error)
Op basis van de signatuur bevat het functie een interface, wat betekent dat een aantal argumenten van elk type kan mee gegeven worden.
package main
import "fmt"
func main() {
fmt.Println("Go dev tips is geweldig!")
}
‘Vet’ commando voor het scannen en vinden van syntax fouten codes
Het ‘vet’ commando zoek door je Go-broncode code heen naar synthax fouten. Met alle foutmelding voorbeelden van de vorige secties hierboven, kun je synthax fouten vastleggen die misschien niet door de compiler worden opgevangen.
Deze functie kan gebruik worden door de volgende commando:
go vet <project file>
In dit volgende code voorbeeld gaan we het bestand print_f.go
scannen op eventuele synthax fouten. Het resultaat hieronder geef aan dat er een fout is op regel 13 met de Sprintf
functie die twee argumenten bevatten in plaats van één:
Volg ons: