acwing
INFO
自律真的很难,尤其停下来以后就懒得动了,所以既然开始了就别停了。
go语言的输入输出方法
基础
go
import "fmt"
var n int
fmt.Scanf("%d", &n) // 读, 存到n
fmt.Println(n) // 把n输出(=答案),而且自带“\n”
fmt.Scanln(&n) //可以用来读一行字符串
看看就好,太基础了,效率不是很高感觉
使用bufio
go
import (
"bufio"
"os"
"fmt"
)
var (
n int
in = bufio.NewReader(os.Stdin)
out = bufio.NewWriter(os.Stdout)
)
fmt.Fscan(in, &n) // 读, 存到n
fmt.Fprint(out, n) // 把n输出(=答案)
out.Flush() // 从缓存中读出答案
// 这里读的时候也可以使用
line, err := reader.ReadString('\n') // 以换行符结束
if err != nil {
fmt.Println("读取错误:", err)
return
}
fmt.Printf("输入内容: %q\n", line) // 包含换行符
// 若是想去除分隔符:
line = strings.TrimSpace(line) // 去除换行符和空格
// 或
line = strings.TrimSuffix(line, "\n") // 仅去除换行符
以上代码中,bufio
看不懂的直接搜,隔壁板块总结。
bufio.Scanner
使用Scanner可以简单高效按行读取,Scanner实际上也是一个io.Reader
。
go
func main() {
scanner := bufio.NewScanner(os.Stdin) // 包装标准输入
for scanner.Scan() { // 逐行扫描
line := scanner.Text() // 获取当前行(自动去掉换行符)
fmt.Println("输入:", line)
}
if err := scanner.Err(); err != nil { // 检查错误
fmt.Fprintln(os.Stderr, "读取错误:", err)
}
}
当输入很大时
go
in = bufio.NewScanner(os.Stdin)
bs = make([]byte, 20000 * 1024)
in.Buffer(bs, len(bs)) //!很重要
Buffer方法是Scanner类的一个方法,可以设定缓冲区和最大允许的长度。
fmt.Sscanf(str string, format string, a ...interface{})
可以将字符串解析为想要的格式,例如:
go
var x, y int
str := "10 20"
n, err := fmt.Sscanf(str, "%d %d", &x, &y)
// 复杂的也行
var name string
var age int
str := "Alice:25"
fmt.Sscanf(str, "%s:%d", &name, &age)
感觉可以配合Scanner.Text(),读进来以后再处理。
该函数返回(n,err),n代表成功解析的个数,例如:
go
str := "42"
var a, b int
n, _ := fmt.Sscanf(str, "%d %d", &a, &b)
fmt.Println(n, a, b) // 输出: 1 42 0 (仅解析了第一个值)
Swap
go语言没有swap函数,但是支持多重赋值语法:
go
arr[i], arr[j] = arr[j], arr[i]
slices包
slices包有Reverse, Contains方法,在1.21版本出现
Reverse
可以用来reverse 某个 slice, 如果想要字符串进行reverse,可以进行如下的操作:
go
runes := []rune(str)
slices.Reverse(runes)
reverse_str := string(runes)
Equal
可以比较两个slices是否相同。
Sort
在其他地方写过这个方法了。
Index
查找某个元素在切片中第一次出现的索引,未找到则返回 -1。
Clone
创建并返回一个切片的浅拷贝。
虚假Filter
go
filterLetters := func(r rune) rune {
if unicode.IsLetter(r) {
return r
}
return -1 // 返回-1表示丢弃该字符
}
lettersOnly := strings.Map(filterLetters, mixedString)
fmt.Printf("只保留字母: %s\n", lettersOnly)
unicode包
可以用来判断rune是否为某个特定类型,例如:
- unicode.IsDigit(r rune) bool: 判断一个字符是否是十进制数字 ('0'-'9')。
- unicode.IsLetter(r rune) bool: 判断一个字符是否是字母。
- unicode.IsNumber(r rune) bool: 判断一个字符是否是数字(范围比 IsDigit 更广,包括罗马数字等)。
- unicode.IsUpper(r rune) bool: 判断一个字符是否是大写字母。
- unicode.IsLower(r rune) bool: 判断一个字符是否是小写字母。
- unicode.IsTitle(r rune) bool: 判断一个字符是否是标题格式的字母(比如 'Dž', 'Lj' 等)。
- unicode.IsSpace(r rune) bool: 判断一个字符是否是空白字符(包括空格、tab、换行符等)。
- unicode.IsPunct(r rune) bool: 判断一个字符是否是标点符号。
- unicode.IsSymbol(r rune) bool: 判断一个字符是否是符号。
- unicode.IsGraphic(r rune) bool: 判断一个字符是否是“图形”字符(字母、数字、标点、符号的总和)。与 IsControl 相对。
- unicode.IsControl(r rune) bool: 判断一个字符是否是控制字符。
- unicode.IsPrint(r rune) bool: 判断一个字符是否是 Go 定义的可打印字符(图形字符、ASCII 空格)。
常用的一些函数
- strings.Fields(string) 将字符串以空格形式分割,自动去除多个空格,首位空格等等情况。