Golang中的一些关键字(defer、:=、go func())

作者:非妃是公主
专栏:《Golang》
博客主页https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

一、defer

defer表示延迟调用,在程序返回前进行调用。

如果程序中存在多个defer,调用顺序类似于栈,后定义的先执行,先定义的后执行。


二、var与 := 的区别

1. var

  1. 声明变量,如下:
// 定义一个名称为“variableName”,类型为"type"的变量
// var variableName type
var number int
  1. 定义并初始化变量
// 初始化“variableName”的变量为“value”值,类型是“type”
// var variableName type = value
var number int = 10
  1. 同时定义并初始化多个变量——平行赋值
/* 定义三个类型都是"type"的变量,并且分别初始化为相应的值
    vname1为v1,vname2为v2,vname3为v3
    */
// var vname1, vname2, vname3 type = v1, v2, v3
var number1, number2, number3 int = 1, 2, 3

2. :=

相比于var,:=的有点是,可以自动推导变量类型,如下:

/* 
定义三个变量,它们分别初始化为相应的值    
vname1为v1,vname2为v2,vname3为v3    
编译器会根据初始化的值自动推导出相应的类型
*/
// vname1, vname2, vname3 := v1, v2, v3
number1, number2, number3 := 1, 2, 3

3. 二者区别

:=这个符号直接取代了vartype,这种形式叫做简短声明。但是,值得注意的是,它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量。

换句话说,“:=”只能在声明“局部变量”的时候使用,而“var”没有这个限制。1


三、go func

go关键字,相当于新开一个线程,在go语言中叫做goroutine。由于是新开一个线程,所以它的运行与主线程是并行的。具体可以看如下的示例程序:

package main

import (
	"fmt"
	"time"
)

func main() {
    
    
	go spinner(100 * time.Millisecond)
	const n = 45
	fibN := fib(n) // slow
	fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}

func spinner(delay time.Duration) {
    
    
	for {
    
    
		for _, r := range `-\|/` {
    
    
			fmt.Printf("\r%c", r)
			time.Sleep(delay)
		}
	}
}

func fib(x int) int {
    
    
	if x < 2 {
    
    
		return x
	}
	return fib(x-1) + fib(x-2)
}

这是一个计算斐波那契的程序,计算第45项的值。由于采用递归算法进行实现,这需要耗费一定的时间,我们通过spinner函数,来新开辟1个线程(或者称为goroutine)来动态的显示程序的运行状态。

程序运行结果如下:
在这里插入图片描述

最终输出结果如下:

在这里插入图片描述

值得注意的是,语句fmt.Printf("\r%c", r)中的"\r%c"作用是:字符串格式化语句,在行首不断输出字符,由于是在行首,所以不断覆盖,不会向后输出,产生了原地旋转小车轮的动态效果。

其中,"\n"是换行符,"\r"是回车符(返回行首),由于我们轮流输出"-\|/",因此产生动态的效果。关于"\r"的详细介绍可以参考:https://blog.csdn.net/myf_666/article/details/128731608


  1. https://www.php.cn/be/go/439542.html ↩︎

猜你喜欢

转载自blog.csdn.net/myf_666/article/details/128730478