Go 函数在点击返回语句时不退出

Go 函数在点击返回语句时不退出,go,Go,我有一个奇怪的问题。我在玩围棋,发现了一些我无法理解的奇怪行为 当我运行findMatchingSum函数时,它通过以下方式搜索期望的总和:如果总和较大,我将最后一个索引减少1;如果较大,则将第一个索引增加1 然而,当我调试代码时,它首先命中if语句并应返回true,然而它直接转到并运行最后一个else if语句 混乱从这里开始。在第三次迭代中,它命中if语句进入该块,但不退出函数 这是代码 package main import "fmt" var arr = []int{1,2,4,4

我有一个奇怪的问题。我在玩围棋,发现了一些我无法理解的奇怪行为

当我运行
findMatchingSum
函数时,它通过以下方式搜索期望的总和:如果总和较大,我将最后一个索引减少1;如果较大,则将第一个索引增加1

然而,当我调试代码时,它首先命中if语句并应返回true,然而它直接转到并运行最后一个else if语句

混乱从这里开始。在第三次迭代中,它命中if语句进入该块,但不退出函数

这是代码

package main

import "fmt"

var arr  = []int{1,2,4,4}

func main() {
    s := findMatchingSum(arr, 8, len(arr) - 1, 0)
    fmt.Println(s)
}

func findMatchingSum(arr []int, sum , last, first int ) bool {
    if arr[first] + arr[last] == sum {
        return true
    } else if  arr[first] + arr[last] > sum {
        findMatchingSum(arr, sum, last - 1, first)
    } else if arr[first] + arr[last] < sum {
        findMatchingSum(arr, sum, last, first + 1)
    }
    return false
}
主程序包
输入“fmt”
var arr=[]int{1,2,4,4}
func main(){
s:=findMatchingSum(arr,8,len(arr)-1,0)
fmt.Println(s)
}
func findMatchingSum(arr[]int,sum,last,first int)bool{
如果arr[第一次]+arr[最后一次]==总和{
返回真值
}否则,如果arr[第一次]+arr[最后一次]>总和{
findMatchingSum(arr,sum,last-1,first)
}否则,如果arr[第一次]+arr[最后一次]<总和{
findMatchingSum(arr、sum、last、first+1)
}
返回错误
}
您忘记了从else if分支“返回”。这应该起作用:

func findMatchingSum(arr []int, sum , last, first int ) bool {
    if arr[first] + arr[last] == sum {
        return true
    } else if  arr[first] + arr[last] > sum {
        return findMatchingSum(arr, sum, last - 1, first)
    } else if arr[first] + arr[last] < sum {
        return findMatchingSum(arr, sum, last, first + 1)
    }
    return false
}
func findMatchingSum(arr[]int,sum,last,first int)bool{
如果arr[第一次]+arr[最后一次]==总和{
返回真值
}否则,如果arr[第一次]+arr[最后一次]>总和{
返回findMatchingSum(arr、sum、last-1、first)
}否则,如果arr[第一次]+arr[最后一次]<总和{
返回findMatchingSum(arr、sum、last、first+1)
}
返回错误
}

如果不执行此操作,将执行第三个分支,但函数不会退出-它将跳转到下一条指令,即“return false”。

我认为这有点奇怪。就我所知,函数应该退出并返回值。但在本例中,它会返回,但仍会继续执行。这不是很奇怪吗?这与语言语义有关吗?你的代码工作得非常好,谢谢你:让我稍微澄清一下:这是一个几乎每种命令语言(java,c,C++,c++,javascript,python,php等)发生的事情。当您调用“findMatchingSum”时,您并不是跳入同一个函数——实际上您是在调用一个新函数。如果您不使用“return”或变量来存储函数返回的任何值,那么您就是在丢弃它。尝试研究递归以确保您了解调用堆栈是如何工作的。您希望它在哪里退出函数?嗨,Flimzy,多亏了@haasc,我找到了它。当我调试程序时,我感到很困惑,它正在运行return语句,我认为函数应该在这一点上退出并返回真正的值。我的错误。谢谢你的帮助:)