Skip to content

Input/Output Go

go
package main

import "fmt"

func main() {
   fmt.Println("Hello Mondo!")
}

Il primo caso di入门 di questo sito è l'output di una stringa. In questa sezione verrà spiegato come eseguire input e output in Go.

Descrittori di file

go
var (
   Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
   Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
   Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

Nel pacchetto os ci sono tre descrittori di file esposti, i cui tipi sono *os.File, rispettivamente:

  • os.Stdin - Input standard
  • os.Stdout - Output standard
  • os.Stderr - Errore standard

L'input e l'output in Go non possono prescindere da essi.

Output

In Go ci sono molti metodi di output, di seguito alcuni dei più comuni

stdout

Poiché l'output standard è esso stesso un file, puoi scrivere direttamente una stringa nell'output standard

go
package main

import "os"

func main() {
  os.Stdout.WriteString("hello world!")
}

print

Go ha due funzioni incorporate print e println, che stamperanno i parametri nell'errore standard, solo per debug, generalmente non si consiglia l'uso.

go
package main

func main() {
  print("hello world!\n")
  println("hello world")
}

fmt

L'uso più comune è utilizzare il pacchetto fmt, che fornisce la funzione fmt.Println, che per impostazione predefinita stamperà i parametri nell'output standard.

go
package main

import "fmt"

func main() {
  fmt.Println("hello world!")
}

I suoi parametri supportano qualsiasi tipo. Se il tipo implementa l'interfaccia String, verrà chiamato anche il metodo String per ottenere la sua rappresentazione come stringa, quindi il contenuto output ha una leggibilità relativamente alta, adatto alla maggior parte delle situazioni. Tuttavia, poiché internamente utilizza la riflessione, non si consiglia un uso massiccio in scenari sensibili alle prestazioni.

bufio

bufio fornisce metodi di output bufferizzati. Scriverà prima i dati in memoria e, una volta accumulata una certa soglia, li outputerà al Writer specificato. La dimensione predefinita del buffer è 4KB. Si consiglia di utilizzare questo pacchetto durante l'I/O di file e l'I/O di rete.

go
func main() {
  writer := bufio.NewWriter(os.Stdout)
  defer writer.Flush()
  writer.WriteString("hello world!")
}

Puoi anche combinarlo con il pacchetto fmt

go
func main() {
  writer := bufio.NewWriter(os.Stdout)
  defer writer.Flush()
  fmt.Fprintln(writer, "hello world!")
}

Formattazione

La funzionalità di output formattato in Go è fornita principalmente dalla funzione fmt.Printf. Se hai imparato linguaggi della famiglia C, ti sembrerà familiare. Di seguito è riportato un esempio semplice.

go
func main() {
  fmt.Printf("hello world, %s!", "jack")
}

Di seguito sono riportati tutti i verbi di formattazione attualmente disponibili in Go.

0FormattazioneDescrizioneTipo ricevuto
1%%Stampa il simbolo di percentuale %Qualsiasi
2%sStampa il valore string/[] bytestring,[] byte
3%qFormatta la stringa, la stringa output ha virgolette doppie "" alle estremitàstring,[] byte
4%dStampa il valore intero decimaleIntero
5%fStampa il numero floating-pointFloating-point
6%eStampa in notazione scientifica, può essere utilizzato anche per numeri complessiFloating-point
7%EUguale a %eFloating-point
8%gDetermina se outputare %f o %e in base alla situazione, rimuoverà gli 0 superfluiFloating-point
9%bStampa la rappresentazione binaria dell'interoNumero
10%#bStampa la rappresentazione completa in binarioNumero
11%oStampa la rappresentazione ottale dell'interoIntero
12%#oStampa la rappresentazione ottale completa dell'interoIntero
13%xStampa la rappresentazione esadecimale minuscola dell'interoNumero
14%#xStampa la rappresentazione esadecimale minuscola completa dell'interoNumero
15%XStampa la rappresentazione esadecimale maiuscola dell'interoNumero
16%#XStampa la rappresentazione esadecimale maiuscola completa dell'interoNumero
17%vStampa il valore nel suo formato originale, utilizzato principalmente per l'output di strutture datiQualsiasi
18%+vStampa il nome del campo quando si outputa una strutturaQualsiasi
19%#vStampa il valore nel formato completo della sintassi GoQualsiasi
20%tStampa il valore booleanoBooleano
21%TStampa il valore del tipo Go corrispondente al valoreQualsiasi
22%cStampa il carattere corrispondente al codice Unicodeint32
23%UStampa il codice Unicode corrispondente al carattererune,byte
24%pStampa l'indirizzo puntato dal puntatorePuntatore

Utilizza fmt.Sprintf o fmt.Printf per formattare stringhe o output di stringhe formattate. Guarda alcuni esempi

go
fmt.Printf("%%%s\n", "hello world")

fmt.Printf("%s\n", "hello world")
fmt.Printf("%q\n", "hello world")
fmt.Printf("%d\n", 2<<7-1)

fmt.Printf("%f\n", 1e2)
fmt.Printf("%e\n", 1e2)
fmt.Printf("%E\n", 1e2)
fmt.Printf("%g\n", 1e2)

fmt.Printf("%b\n", 2<<7-1)
fmt.Printf("%#b\n", 2<<7-1)
fmt.Printf("%o\n", 2<<7-1)
fmt.Printf("%#o\n", 2<<7-1)
fmt.Printf("%x\n", 2<<7-1)
fmt.Printf("%#x\n", 2<<7-1)
fmt.Printf("%X\n", 2<<7-1)
fmt.Printf("%#X\n", 2<<7-1)

type person struct {
    name    string
    age     int
    address string
}
fmt.Printf("%v\n", person{"lihua", 22, "beijing"})
fmt.Printf("%+v\n", person{"lihua", 22, "beijing"})
fmt.Printf("%#v\n", person{"lihua", 22, "beijing"})
fmt.Printf("%t\n", true)
fmt.Printf("%T\n", person{})
fmt.Printf("%c%c\n", 20050, 20051)
fmt.Printf("%U\n", '')
fmt.Printf("%p\n", &person{})

Quando si utilizzano altre basi, aggiungendo uno spazio tra % e il verbo di formattazione si può ottenere l'effetto di un separatore, ad esempio

go
func main() {
  str := "abcdefg"
  fmt.Printf("%x\n", str)
  fmt.Printf("% x\n", str)
}

Il risultato output di questo esempio è

61626364656667
61 62 63 64 65 66 67

Quando si utilizzano numeri, è anche possibile aggiungere automaticamente zeri. Ad esempio

go
fmt.Printf("%09d", 1)
// 000000001

Lo stesso vale per il binario

go
fmt.Printf("%09b", 1<<3)
// 000001000

Situazioni di errore

Numero di caratteri di formattazione < Numero di parametri

go
fmt.Printf("", "") //%!(EXTRA string=)

Numero di caratteri di formattazione > Numero di parametri

go
fmt.Printf("%s%s", "") //%!s(MISSING)

Tipo non corrispondente

go
fmt.Printf("%s", 1) //%!s(int=1)

Verbo di formattazione mancante

go
fmt.Printf("%", 1) // %!(NOVERB)%!(EXTRA int=1)

Input

Di seguito sono introdotti i metodi di input comuni

read

Puoi leggere il contenuto dell'input proprio come leggi direttamente un file, come segue

go
func main() {
  var buf [1024]byte
  n, _ := os.Stdin.Read(buf[:])
  os.Stdout.Write(buf[:n])
}

È troppo fastidioso da usare, generalmente non si consiglia l'uso.

fmt

Possiamo utilizzare alcune funzioni fornite dal pacchetto fmt, l'uso è simile a C.

go
// Scansiona il testo letto da os.Stdin, separato da spazi, anche il ritorno a capo è considerato uno spazio
func Scan(a ...any) (n int, err error)

// Simile a Scan, ma si interrompe la scansione quando si incontra un ritorno a capo
func Scanln(a ...any) (n int, err error)

// Scansiona in base a una stringa formattata
func Scanf(format string, a ...any) (n int, err error)

Leggere due numeri

go
func main() {
  var a, b int
  fmt.Scanln(&a, &b)
  fmt.Printf("%d + %d = %d\n", a, b, a+b)
}

Leggere un array di lunghezza fissa

go
func main() {
  n := 10
  s := make([]int, n)
  for i := range n {
    fmt.Scan(&s[i])
  }
  fmt.Println(s)
}
1 2 3 4 5 6 7 8 9 10
[1 2 3 4 5 6 7 8 9 10]

bufio

Quando c'è una grande quantità di input da leggere, si consiglia di utilizzare bufio.Reader per leggere il contenuto

go
func main() {
    reader := bufio.NewReader(os.Stdin)
    var a, b int
    fmt.Fscanln(reader, &a, &b)
    fmt.Printf("%d + %d = %d\n", a, b, a+b)
}

scanner

bufio.Scanner è simile a bufio.Reader, ma legge per righe.

go
func main() {
  scanner := bufio.NewScanner(os.Stdin)
  for scanner.Scan() {
    line := scanner.Text()
    if line == "exit" {
      break
    }
    fmt.Println("scan", line)
  }
}

Il risultato è il seguente

first line
scan first line
second line
scan second line
third line
scan third line
exit

TIP

Per quanto riguarda l'input e l'output, se vuoi fare pratica, puoi risolvere alcuni semplici problemi algoritmici in modalità ACM su Luogu per familiarizzare.

Golang by www.golangdev.cn edit