输入输出库
fmt
fmt.Scan()
fmt.Scan()
多用来获取已知长度、已知数量的变量输入。从os.Stdin
中获取数据。
它将碰到第一个空格或换行符之前的内容赋值给变量。如果
Scan()
中有多个变量,变量值用空格或换行符分割。所以换行和空
格是不能存储到变量内的。
func main() {
var t int
fmt.Scan(&t)
for i := 0; i < t; i++ {
var n int
fmt.Scan(&n)
sum := 0
for j := 0; j < n; j++ {
var a int
fmt.Scan(&a)
sum += a
}
fmt.Println(sum)
}
}
fmt.Scanln
fmt.Scanln()
和fmt.Scan()
的用法类似,但唯一区别是当读取多个变量当时候,遇到换行符Scanln()
会直接结束,未读到输入值的变量为零值;Scan()
会等待,直到输入的值满足参数的个数后再遇到换行符才会结束。
通常情况下使用Scan()
就够了。
bufio
bufio.NewScanner
bufio.NewScanner
常用于不确定要输入多少数据的情况。例如:
func main() {
// 从标准输入输出 os.Stdin 中读取数据
inputBuf := bufio.NewScanner(os.Stdin)
// inputBuf.Scan() 用来循环读取下一行 直到出现io.EOF
for inputBuf.Scan() {
data := inputBuf.Text()
tmpStrs := strings.Split(data, ",")
sort.Slice(tmpStrs, func(i, j int) bool {
if strings.Compare(tmpStrs[i], tmpStrs[j]) < 0 {
return true
} else {
return false
}
})
for i, s := range tmpStrs {
if i != len(tmpStrs)-1 {
fmt.Printf("%s,", s)
} else {
fmt.Printf("%s\n", s)
}
}
}
}
排序库 Sort
- 对 float64 切片进行排序:
sort.Float64s(s)
import (
"fmt"
"sort"
)
func main() {
s := []float64{5.2, -1.3, 0.7, -3.8, 2.6} // unsorted
sort.Float64s(s)
fmt.Println(s)
// [-3.8 -1.3 0.7 2.6 5.2]
}
- 对 int 切片进行排序:
sort.Ints(s)
import (
"fmt"
"sort"
)
func main() {
s := []int{5, 2, 6, 3, 1, 4} // unsorted
sort.Ints(s)
fmt.Println(s)
// [1 2 3 4 5 6]
}
- 对 slice 使用自定义排序顺序:
sort.Slice(x any, less func(i, j int) bool)
import (
"fmt"
"sort"
)
func main() {
people := []struct {
Name string
Age int
}{
{"Gopher", 7},
{"Alice", 55},
{"Vera", 24},
{"Bob", 75},
}
sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age })
fmt.Println("By age:", people)
// By age: [{Gopher 7} {Vera 24} {Alice 55} {Bob 75}]
}
字符串处理
strings
Split ¶
- 根据指定字符进行分割,需要注意字符串首尾:
func Split(s, sep string) []string
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Printf("%q\n", strings.Split("a,b,c", ","))
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
fmt.Printf("%q\n", strings.Split(" xyz ", ""))
fmt.Printf("%q\n", strings.Split(" xyz ", " "))
fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))
}
// Output:
// ["a" "b" "c"]
// ["" "man " "plan " "canal panama"]
// [" " "x" "y" "z" " "]
// ["" "xyz" ""]
// [""]
Index
- 找到子串的起始位置,如果没有返回 -1:
func Index(s, substr string) int
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
}
// Output:
// 4
// -1
strconv
Atoi
- 字符串类型的数字转化为 int 类型:
func Atoi(s string) (int, error)
package main
import (
"fmt"
"strconv"
)
func main() {
v := "10"
if s, err := strconv.Atoi(v); err == nil {
fmt.Printf("%T, %v", s, s)
}
}
// Output:
// int, 10
Itoa
- 将 int 类型转为字符串:
func Itoa(i int) string
package main
import (
"fmt"
"strconv"
)
func main() {
i := 10
s := strconv.Itoa(i)
fmt.Printf("%T, %v\n", s, s)
}
// Output:
// string, 10
ParseInt
- 灵活的将字符串转为正整数:
func ParseInt(s string, base int, bitSize int) (i int64, err error)
- 三个参数的含义依次是:
- 要转换的字符串
- 转换为几进制,可以是0,2 ~ 36,我们一般用10进制
- 具体的int类型,可以是 0, 8, 16,32,和64,代表 int,int8,int16,int32和int64,一般用 0 转换为int类型
package main
import (
"fmt"
"strconv"
)
func main() {
v32 := "-354634382"
if s, err := strconv.ParseInt(v32, 10, 32); err == nil {
fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseInt(v32, 16, 32); err == nil {
fmt.Printf("%T, %v\n", s, s)
}
v64 := "-3546343826724305832"
if s, err := strconv.ParseInt(v64, 10, 64); err == nil {
fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseInt(v64, 16, 64); err == nil {
fmt.Printf("%T, %v\n", s, s)
}
}
// int64, -354634382
// int64, -3546343826724305832
ParseFloat
- 用于将字符串转化为 float 类型:
func ParseFloat(s string, bitSize int) (float64, error)
- 参数:
s
:将要转化的字符串bitSize
:可选 32 或 64 代表转化为 float32 还是 float64
FormatFloat
- 用于将 float 转化为字符串类型:
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
- 参数说明:
f
:所需要转化的浮点数fmt
:格式,有 ‘b’,’e’,‘E’,‘f’,‘g’,‘G’,‘x’,‘X’ 这些选项,一般使用 ‘f’ 表示没有指数- prec:表示精度,小数点后保留几位
- bitSize:有 32 和 64 两种选项,表示 float32 或 float64 类型
package main
import (
"fmt"
"strconv"
)
func main() {
f := 3.1415926
s := strconv.FormatiFloat(f, 'f', 2, 64)
fmt.Println(s)
}
// 3.14
FormatInt
- 将 Int 为字符串类型:
func FormatInt(i int64, base int) string
- 参数说明:
i
:表示要转化的浮点数base
:进制,可选 2到36
package main
import (
"fmt"
"strconv"
)
func main() {
v := int64(-42)
s10 := strconv.FormatInt(v, 10)
fmt.Printf("%T, %v\n", s10, s10)
s16 := strconv.FormatInt(v, 16)
fmt.Printf("%T, %v\n", s16, s16)
}
// Output:
// string, -42
// string, -2a