输入输出函数
2025年4月16日大约 4 分钟
GO
输出函数
fmt.Println
此函数会输出传入的参数,并且在结尾添加换行符。
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
num := 10
fmt.Println("The number is", num)
}
fmt.Printf
是格式化输出函数,能依据指定格式输出内容。
package main
import "fmt"
func main() {
num := 10
fmt.Printf("The number is %d\n", num)
str := "Hello"
fmt.Printf("The string is %s\n", str)
}
常用格式化参数
package main
import "fmt"
func main() {
// 整数
age := 25
fmt.Printf("整数(十进制):年龄是 %d 岁\n", age)
//可通过%09d来控制位数和填充符号
var a = 123
fmt.Printf("%09d", a)
// 浮点数
//可通过.3f来控制位数
price := 9.99
fmt.Printf("浮点数(十进制):商品价格是 %f 元\n", price)
//可通过.3f来控制位数
. var a = 1.23
fmt.Printf("%.3f", a)
// 字符串
message := "欢迎使用Go语言"
fmt.Printf("字符串:%s\n", message)
// 通用
num := 10
str := "测试"
fmt.Printf("通用格式:数字 %v,字符串 %v\n", num, str)
}
输入函数
少量输入
fmt.Scan
从标准输入读取数据,以空白字符(空格、制表符、换行符)分隔。
package main
import "fmt"
func main() {
var a, b int
fmt.Scan(&a, &b)
fmt.Println(a + b)
}
fmt.Scanf
:可以按照指定的格式读取输入,使用方法与 C 语言的scanf
类似。
package main
import "fmt"
func main() {
var a, b int
fmt.Scanf("%d %d", &a, &b)
fmt.Println(a + b)
}
fmt.Scanln
:和 fmt.Scan
类似,但它会读取到换行符为止
package main
import "fmt"
func main() {
var a, b int
fmt.Scanln(&a, &b)
fmt.Println(a + b)
}
这里需要注意的就是,fmt.Scanln
和fmt.Scanf
他们遇到换行就会结束输入流程。但fmt.Scan
会一直接受到数据为止。
- 分隔符:
fmt.Scan
以空白字符作为分隔符;fmt.Scanln
以换行符作为结束标志。 - 输入处理:
fmt.Scan
会处理多余的输入,将其留在输入缓冲区;fmt.Scanln
会忽略多余的输入。 - 错误处理:若输入的数据数量少于参数数量,
fmt.Scan
会等待更多输入,而fmt.Scanln
会产生错误
大量输入
当需要处理大量输入时,bufio
包的效率会更高。因为它会在内存里构建一个缓冲区。在读取输入时,数据会先被一次性从数据源(像文件、网络连接等)读取到缓冲区,之后程序从缓冲区获取数据;在写入输出时,数据会先被写入缓冲区,等缓冲区满了或者手动刷新时,再一次性把缓冲区里的数据写入目标位置。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
input := strings.Split(scanner.Text(), " ")
a, _ := strconv.Atoi(input[0])
b, _ := strconv.Atoi(input[1])
fmt.Println(a + b)
}
bufio.Scanner
会按行扫描输入,也就是每次调用Scan
方法,它会读取一行输入。- 若成功读取到下一个标记,
Scan
方法会返回true
;若遇到输入结束(EOF)或者出现错误,就会返回false
。
数据处理
数组
创建
实际使用中,我们一般使用切片来进行创建数组,切片是对数组的抽象,它建立在数组之上。切片本身不存储数据,而是借助对底层数组的引用来访问和操作数据。
package main
import "fmt"
func main() {
// 创建一个长度为 5,容量为 10 的切片
numbers := make([]int, 5, 10)
// 打印切片
fmt.Println(numbers)
// 检查切片的长度和容量
fmt.Printf("长度: %d, 容量: %d\n", len(numbers), cap(numbers))
}
遍历
使用 for
循环和索引
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
for i := 0; i < len(arr); i++ {
fmt.Printf("Index %d: %d\n", i, arr[i])
}
}
使用 for...range
循环
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5}
for index, value := range arr {
fmt.Printf("Index %d: %d\n", index, value)
}
}
字符串
strings.Split
:按照指定的分隔符对字符串进行分割,返回一个字符串切片
package main
import (
"fmt"
"strings"
)
func main() {
str := "hello,world,go"
parts := strings.Split(str, ",")
fmt.Println(parts) // 输出 [hello world go]
}
strings.Trim
:去除字符串首尾的指定字符。
package main
import (
"fmt"
"strings"
)
func main() {
str := " hello world "
newStr := strings.Trim(str, " ")
fmt.Println(newStr) // 输出 hello world
}
strings.Join
:将字符串切片按照指定的分隔符拼接成一个字符串。
package main
import (
"fmt"
"strings"
)
func main() {
parts := []string{"hello", "world", "go"}
str := strings.Join(parts, ",")
fmt.Println(str) // 输出 hello,world,go
}
strings.Replace
:对字符串中的指定子字符串进行替换。
package main
import (
"fmt"
"strings"
)
func main() {
str := "hello world"
newStr := strings.Replace(str, "world", "go", 1)
fmt.Println(newStr) // 输出 hello go
}