最近需要写一个云环境的可执行程序,一般使用go语言,毕竟GC+原生运行,结合了不需要回收指针的能力和原生运行,但是在程序返回时,笔者看到一个sdk的源码懵了,返回的数据居然可以隐式返回。
![]()
go 版本
笔者看到的代码,可以明显看到返回值是没写的,go却是一个强类型语言,返回值不匹配是会报错的,那么可以推断,这个go编译器自己把返回值变量的数据返回,所以没有定义返回值变量的不能这样使用。

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可以返回返回值变量的数据,如果没有修改返回值变量就使用默认初始化的值。也可以部分定义返回值变量,但是没有定义变量的返回值只能返回默认初始值。