go语言输入输出与控制流

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")
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值