go语言输入输出

输入

fmt包的输入

1
2
3
fmt.Scanf("%d %f %s %t %c", &a, &b, &str, &c, &d) //格式化输入,与C相同
fmt.Scan(&a, &b, &c, &str) //与Scanf类似但无格式化
fmt.Scanln(&a, &b, &c, &str) //读取一整行输入

main函数传参

通过OS包的Args获取main的参数(此方法不能确定参数类型)

os.Args是一个[]string类型,命令行中的参数会被写入到os.Args数据中

1
2
3
4
5
func main(){
for i,j=range os.Args{
fmt.Println(j) //os.Args[0]存放的是程序地址
}
}

通过flag包的Parse()获取参数(此方法可以指定类型,携带tag)

需要声明参数对应的类型和格式

1
2
3
4
5
6
var b = flag.String("b","","string参数") //返回指针

func main(){
flag.Parse();
fmt.Println("-b:",*b)
}
1
go run main.go -b 123456

bufio输入

bufio是带有缓冲的输入输出流,这里只讨论输入

1
2
3
reader = bufio.NewReader(os.stdin)//接受键盘(终端)输入,根据需求可以换为链接、文件等
reader.byte()//读取一个字节
reader.bytes('\n')//读入多个字节,遇到\n停止 返回 byte 数组 包含\n

输出

fmt包的输出

1
2
fmt.Printf()//格式化输出,与C相同
fmt.Println()//连续输出,自带换行

bufio输出

bufio是带有缓冲的输入输出流,这里只讨论输出

1
2
3
writer = bufio.NewWriter(os.stdout)//输出到终端,可以根据需求换为链接、文件等
writer.WriteString("str") //写一个字符串到缓冲区
writer.Flush() //将缓冲区的内容写入连接对象

go语言控制流

if-else

与C语言无异,只要求必须携带{}且判断式不带()

循环

与C语言的for循环无异,只要求判断式不带()

switch

与C语言的switch case无异,只是case自带break,且判断式更加灵活

不带判断式的switch可以等效成多个if-else

defer

 defer 语句用于延迟函数的执行,直到包含 defer 的函数即将返回时执行。

 当有多个 defer 调用时,它们会按照后进先出(LIFO)的顺序执行:

1
2
3
4
5
6
func main() {
defer fmt.Println("First")
defer fmt.Println("Second")
defer fmt.Println("Third")
fmt.Println("Function body")
}

结果为:

1
2
3
4
Function body
Third
Second
First

defer常用于关闭连接、文件等,可以有效避免泄露

defer 和匿名函数常用于捕获和处理错误,特别是用于捕获 panic 并恢复程序的执行:

1
2
3
4
5
6
7
8
9
10
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
fmt.Println("About to panic")
panic("something went wrong")
fmt.Println("This will not be printed")
}