Input Output 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
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 standaros.Stdout- Output standaros.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
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.
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.
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.
func main() {
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
writer.WriteString("hello world!")
}Anda juga dapat menggabungkannya dengan paket fmt
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.
func main() {
fmt.Printf("hello world, %s!", "jack")
}Di bawah ini adalah semua verb formatting yang ada di Go saat ini.
| 0 | Formatting | Deskripsi | Tipe Penerima |
|---|---|---|---|
| 1 | %% | Mengeluarkan tanda persen % | Apa pun |
| 2 | %s | Mengeluarkan nilai string/[] byte | string,[] byte |
| 3 | %q | Memformat string string yang dikeluarkan memiliki tanda kutip ganda "" di kedua ujung | string,[] byte |
| 4 | %d | Mengeluarkan nilai integer desimal | Integer |
| 5 | %f | Mengeluarkan floating point | Floating point |
| 6 | %e | Mengeluarkan bentuk notasi ilmiah juga dapat digunakan untuk bilangan kompleks | Floating point |
| 7 | %E | Sama dengan %e | Floating point |
| 8 | %g | Sesuai dengan situasi aktual menentukan output %f atau %e akan menghapus 0 yang berlebih | Floating point |
| 9 | %b | Mengeluarkan representasi biner integer | Angka |
| 10 | %#b | Mengeluarkan representasi biner lengkap | Angka |
| 11 | %o | Mengeluarkan representasi oktal integer | Integer |
| 12 | %#o | Mengeluarkan representasi oktal lengkap integer | Integer |
| 13 | %x | Mengeluarkan representasi heksadesimal huruf kecil integer | Angka |
| 14 | %#x | Mengeluarkan representasi heksadesimal huruf kecil lengkap integer | Angka |
| 15 | %X | Mengeluarkan representasi heksadesimal huruf besar integer | Angka |
| 16 | %#X | Mengeluarkan representasi heksadesimal huruf besar lengkap integer | Angka |
| 17 | %v | Mengeluarkan nilai dalam bentuk aslinya banyak digunakan untuk output struktur data | Apa pun |
| 18 | %+v | Saat mengeluarkan struct akan menambahkan nama field | Apa pun |
| 19 | %#v | Mengeluarkan nilai dalam format sintaks Go lengkap | Apa pun |
| 20 | %t | Mengeluarkan nilai boolean | Boolean |
| 21 | %T | Mengeluarkan nilai tipe bahasa Go yang sesuai dengan nilai | Apa pun |
| 22 | %c | Mengeluarkan karakter yang sesuai dengan kode Unicode | int32 |
| 23 | %U | Mengeluarkan kode Unicode yang sesuai dengan karakter | rune,byte |
| 24 | %p | Mengeluarkan alamat yang ditunjuk oleh pointer | Pointer |
Menggunakan fmt.Sprintf atau fmt.Printf untuk memformat string atau mengeluarkan string terformat lihat beberapa contoh
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
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 67Saat menggunakan angka juga dapat secara otomatis menambahkan nol. Misalnya
fmt.Printf("%09d", 1)
// 000000001Binari juga sama
fmt.Printf("%09b", 1<<3)
// 000001000Situasi Error
Jumlah karakter formatting < jumlah parameter
fmt.Printf("", "") //%!(EXTRA string=)Jumlah karakter formatting > jumlah parameter
fmt.Printf("%s%s", "") //%!s(MISSING)Tipe tidak cocok
fmt.Printf("%s", 1) //%!s(int=1)Kurang verb formatting
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
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.
// 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
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
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
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.
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
exitTIP
Dalam hal input output jika ingin berlatih pergi ke Luogu mengerjakan beberapa soal algoritma mode ACM sederhana dapat mulai familiar.
