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 123456
bufio输入
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语言无异,只要求必须携带{}且判断式不带()
```go
if 7%2 == 0 { //if的表达式不需要(),类似python 但是必须跟上花括号
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
循环
与C语言的for循环无异,只要求判断式不带()
i := 1
for { //什么都不加就是死循环
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue //break仍然是跳出
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
switch
与C语言的switch case无异,只是case自带break,且判断式更加灵活
不带判断式的switch可以等效成多个if-else
a := 2
switch a { //表达式不需要括号,类型不限制
case 1:
fmt.Println("one") //自带break,执行结束好直接跳出switch
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
switch { //不带表达式的switch可以等效于多个if-else嵌套,比较明了
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
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
First
defer常用于关闭连接、文件等,可以有效避免泄露
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")
}