兄弟連go教程(13)函式 返回值

尹成發表於2018-07-04
不能⽤用容器物件接收多返回值。只能⽤用多個變數,或 "_" 忽略。
func test() (int, int) {
return 1, 2
}
func main() {
// s := make([]int, 2)
// s = test() // Error: multiple-value test() in single-value context
x, _ := test()
println(x)
}


多返回值可直接作為其他函式調⽤用實參。
func test() (int, int) {
return 1, 2
}
func add(x, y int) int {
return x + y
}
func sum(n ...int) int {
var x int
for _, i := range n {
x += i
}
return x
}
func main() {
println(add(test()))
println(sum(test()))
}

命名返回引數可看做與形參類似的區域性變數,最後由 return 隱式返回。
func add(x, y int) (z int) {
z = x + y
return
}
func main() {
println(add(1, 2))
}

命名返回引數可被同名區域性變數遮蔽,此時需要顯式返回。
func add(x, y int) (z int) {
{ // 不能在⼀一個級別,引發 "z redeclared in this block" 錯誤。
var z = x + y
// return // Error: z is shadowed during return
return z // 必須顯式返回。
}
}

命名返回引數允許 defer 延遲調⽤用通過閉包讀取和修改。
func add(x, y int) (z int) {
defer func() {
z += 100
}()
z = x + y
return
}
func main() {
println(add(1, 2)) // 輸出: 103
}

顯式 return 返回前,會先修改命名返回引數。

func add(x, y int) (z int) {
defer func() {
println(z) // 輸出: 203
}()
z = x + y
return z + 200 // 執⾏行順序: (z = z + 200) -> (call defer) -> (ret)
}
func main() {
println(add(1, 2)) // 輸出: 203
}

尹成老師

QQ77025077 

微信18510341407

所有視訊在尹成學院

www.yinchengxueyuan.com

尹成百度雲請聯絡QQ475318423



相關文章