go语言输入输出与控制流
输入
fmt包的输入
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数据中
func main(){
for i,j=range os.Args{
fmt.Println(j) //os.Args[0]存放的是程序地址
}
}通过flag包的Parse()获取参数(此方法可以指定类型,携带tag)
需要声明参数对应的类型和格式
var b = flag.String("b","","string参数") //返回指针
func main(){
flag.Parse();
fmt.Println("-b:",*b)
}go run main.go -b 123456bufio输入
bufio是带有缓冲的输入输出流,这里只讨论输入
reader = bufio.NewReader(os.stdin)//接受键盘(终端)输入,根据需求可以换为链接、文件等
reader.byte()//读取一个字节
reader.bytes('\n')//读入多个字节,遇到\n停止 返回 byte 数组 包含\n输出
fmt包的输出
fmt.Printf()//格式化输出,与C相同
fmt.Println()//连续输出,自带换行bufio输出
bufio是带有缓冲的输入输出流,这里只讨论输出
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)的顺序执行:
func main() {
defer fmt.Println("First")
defer fmt.Println("Second")
defer fmt.Println("Third")
fmt.Println("Function body")
}结果为:
Function body
Third
Second
Firstdefer常用于关闭连接、文件等,可以有效避免泄露
defer 和匿名函数常用于捕获和处理错误,特别是用于捕获 panic 并恢复程序的执行:
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")
}