Skip to content

Input Output Go

go
package main

import "fmt"

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

Kasus入门 pertama situs ini adalah output sebuah string bagian ini akan membahas cara melakukan input output di Go.

File Descriptor

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

Di paket os ada tiga file descriptor yang diekspos tipenya adalah *os.File masing-masing adalah

  • os.Stdin - Input standar
  • os.Stdout - Output standar
  • os.Stderr - Error standar

Input output di Go tidak dapat dipisahkan dari mereka.

Output

Di Go ada banyak metode output berikut adalah beberapa yang umum digunakan

stdout

Karena output standar itu sendiri adalah file Anda dapat langsung menulis string ke output standar

go
package main

import "os"

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

print

Go memiliki dua fungsi built-in print println mereka akan mengeluarkan parameter ke error standar hanya untuk debugging umumnya tidak direkomendasikan untuk digunakan.

go
package main

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

fmt

Penggunaan paling umum adalah menggunakan paket fmt menyediakan fungsi fmt.Println fungsi ini secara default akan mengeluarkan parameter ke output standar.

go
package main

import "fmt"

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

Parameternya mendukung tipe apa pun jika tipe mengimplementasikan antarmuka String juga akan memanggil metode String untuk mendapatkan representasi stringnya jadi konten yang dikeluarkan memiliki keterbacaan yang tinggi cocok untuk sebagian besar situasi tetapi karena menggunakan refleksi di dalamnya tidak direkomendasikan untuk digunakan secara besar-besaran dalam skenario yang sensitif terhadap performa.

bufio

bufio menyediakan metode output yang dapat di-buffer akan menulis data ke memori terlebih dahulu setelah mencapai ambang batas tertentu baru dikeluarkan ke Writer yang ditentukan ukuran buffer default adalah 4KB. Disarankan menggunakan paket ini saat IO file IO jaringan.

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

Anda juga dapat menggabungkannya dengan paket fmt

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

Formatting

Fungsi output terformat di Go pada dasarnya disediakan oleh fungsi fmt.Printf jika Anda pernah mempelajari bahasa seri C pasti akan merasa sangat familiar berikut adalah contoh sederhana.

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

Di bawah ini adalah semua verb formatting yang ada di Go saat ini.

0FormattingDeskripsiTipe Penerima
1%%Mengeluarkan tanda persen %Apa pun
2%sMengeluarkan nilai string/[] bytestring,[] byte
3%qMemformat string string yang dikeluarkan memiliki tanda kutip ganda "" di kedua ujungstring,[] byte
4%dMengeluarkan nilai integer desimalInteger
5%fMengeluarkan floating pointFloating point
6%eMengeluarkan bentuk notasi ilmiah juga dapat digunakan untuk bilangan kompleksFloating point
7%ESama dengan %eFloating point
8%gSesuai dengan situasi aktual menentukan output %f atau %e akan menghapus 0 yang berlebihFloating point
9%bMengeluarkan representasi biner integerAngka
10%#bMengeluarkan representasi biner lengkapAngka
11%oMengeluarkan representasi oktal integerInteger
12%#oMengeluarkan representasi oktal lengkap integerInteger
13%xMengeluarkan representasi heksadesimal huruf kecil integerAngka
14%#xMengeluarkan representasi heksadesimal huruf kecil lengkap integerAngka
15%XMengeluarkan representasi heksadesimal huruf besar integerAngka
16%#XMengeluarkan representasi heksadesimal huruf besar lengkap integerAngka
17%vMengeluarkan nilai dalam bentuk aslinya banyak digunakan untuk output struktur dataApa pun
18%+vSaat mengeluarkan struct akan menambahkan nama fieldApa pun
19%#vMengeluarkan nilai dalam format sintaks Go lengkapApa pun
20%tMengeluarkan nilai booleanBoolean
21%TMengeluarkan nilai tipe bahasa Go yang sesuai dengan nilaiApa pun
22%cMengeluarkan karakter yang sesuai dengan kode Unicodeint32
23%UMengeluarkan kode Unicode yang sesuai dengan karakterrune,byte
24%pMengeluarkan alamat yang ditunjuk oleh pointerPointer

Menggunakan fmt.Sprintf atau fmt.Printf untuk memformat string atau mengeluarkan string terformat lihat beberapa contoh

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{})

Menggunakan basis lain menambahkan spasi antara % dan verb formatting dapat mencapai efek separator misalnya

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

Hasil output contoh ini adalah

61626364656667
61 62 63 64 65 66 67

Saat menggunakan angka juga dapat secara otomatis menambahkan nol. Misalnya

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

Binari juga sama

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

Situasi Error

Jumlah karakter formatting < jumlah parameter

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

Jumlah karakter formatting > jumlah parameter

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

Tipe tidak cocok

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

Kurang verb formatting

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

Input

Di bawah ini adalah metode input yang umum digunakan

read

Anda dapat seperti langsung membaca file membaca konten input sebagai berikut

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

Ini terlalu repot untuk digunakan umumnya tidak direkomendasikan.

fmt

Kita dapat menggunakan beberapa fungsi yang disediakan paket fmt penggunaannya mirip dengan C.

go
// Memindai teks yang dibaca dari os.Stdin sesuai dengan pemisahan spasi baris baru juga dianggap sebagai spasi
func Scan(a ...any) (n int, err error)

// Mirip dengan Scan tetapi berhenti memindai saat bertemu baris baru
func Scanln(a ...any) (n int, err error)

// Memindai sesuai dengan string terformat
func Scanf(format string, a ...any) (n int, err error)

Membaca dua angka

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

Membaca array dengan panjang tetap

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

Saat ada大量 input yang perlu dibaca disarankan menggunakan bufio.Reader untuk membaca konten

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 mirip dengan bufio.Reader tetapi membaca per baris.

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

Hasilnya adalah sebagai berikut

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

TIP

Dalam hal input output jika ingin berlatih pergi ke Luogu mengerjakan beberapa soal algoritma mode ACM sederhana dapat mulai familiar.

Golang by www.golangdev.cn edit