前言
最近需要写一个云环境的可执行程序,一般使用go语言,毕竟GC+原生运行,结合了不需要回收指针的能力和原生运行,但是在程序返回时,笔者看到一个sdk的源码懵了,返回的数据居然可以隐式返回。
准备
go 版本
笔者看到的代码,可以明显看到返回值是没写的,go却是一个强类型语言,返回值不匹配是会报错的,那么可以推断,这个go编译器自己把返回值变量的数据返回,所以没有定义返回值变量的不能这样使用。
demo
1. 没有任何数据的时候
func Hello() (str string, e error) {
return
}
那么就会返回一个初始化的符合要求的值,即返回值的变量(因为返回值的变量会默认初始化一个值)
验证正确,空字符串+nil
2. 如果返回值不定义变量
func Hello() (string, error) {
s, e := "", errors.New("error")
fmt.Println(s, e)
return
}
不可以,编译错误
3. 如果不使用返回值定义的变量
可以,但是返回的数据是返回值变量定义的数据
func Hello() (str string, err error) {
s, e := "123", errors.New("error")
fmt.Println(s, e)
return
}
返回数据
4. 推断如果使用部分返回值变量
func Hello() (str string, err error) {
s, err := "123", errors.New("error")
fmt.Println(s, err)
return
}
结果如下:
5. 全部使用返回值变量
func Hello() (str string, err error) {
str, err = "123", errors.New("error")
fmt.Println(str, err)
return
}
返回结果
6. 部分返回值变量定义
func Hello() (str string, _ error) {
str, err := "123", errors.New("error")
fmt.Println(str, err)
return
}
结果如下:
总结
go语言一个特性,如果定义了返回值变量,那么直接使用return可以返回返回值变量的数据,如果没有修改返回值变量就使用默认初始化的值。也可以部分定义返回值变量,但是没有定义变量的返回值只能返回默认初始值。