Skip to content

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。

alt text

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 空格)。

常用的一些函数

  1. strings.Fields(string) 将字符串以空格形式分割,自动去除多个空格,首位空格等等情况。