Skip to main content

输入输出函数

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.Scanlnfmt.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
}