Golang Go语言中在方法的返回值中声明变量名和在方法中声明有什么不同?

Golang Go语言中在方法的返回值中声明变量名和在方法中声明有什么不同?

今天刷 LeetCode 遇到一个很有意思的 trick:

func reversePrintDefer(head *ListNode) (res []int) {
	//res := make([]int, 0) 
	for head != nil {
		tmp := head
		defer func() {
			res = append(res, tmp.Val)
			fmt.Println(res)
		}()
		head = head.Next
	}
	return res
}

如果打开方法中的res,去掉方法的返回值命名,这时候返回的永远是个空切片 无论哪种方式,在 defer 中的打印都能打印出正确值

有没有大佬知道是什么原因造成的


更多关于Golang Go语言中在方法的返回值中声明变量名和在方法中声明有什么不同?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

更多关于Golang Go语言中在方法的返回值中声明变量名和在方法中声明有什么不同?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang(Go语言)中,方法的返回值中声明变量名和在方法体内部声明变量名,虽然都涉及变量的使用,但它们在语法、可读性和用途上存在显著差异。

  1. 方法返回值中声明变量名

    • 当你在方法的签名中直接为返回值命名时,这些变量在方法体内部是可见的,并且可以直接赋值。
    • 这种做法提高了代码的可读性,因为它清晰地表明了哪些变量是方法的输出。
    • 例如:func MyFunc() (result int) { result = 42; return }。这里,result在方法体内被赋值并返回。
  2. 方法体内部声明变量名

    • 在方法体内部声明的变量是局部的,它们的作用域仅限于方法体内部。
    • 这些变量通常用于存储中间结果或控制流程,并不直接作为方法的返回值。
    • 如果需要将这些局部变量作为返回值,你需要在返回语句中显式地指定它们。
    • 例如:func MyFunc() int { var temp int = 42; return temp }。这里,temp是局部变量,其值被返回。

总结来说,方法返回值中声明变量名是一种更直接、更清晰的表达方法输出的方式,而方法体内部声明的变量则更多地用于实现方法的内部逻辑。两者各有用途,选择哪种方式取决于具体的编程需求和代码风格。

回到顶部