问题
I want to end execution in parent func apiEndpoint()
upon calling/exiting in a child func apiResponse()
func apiEndpoint() {
if false {
apiResponse("error")
// I want apiResponse() call to return (end execution) in parent func
// so next apiResponse("all good") wont be executed
}
apiResponse("all good")
}
func apiResponse(message string) {
// returns message to user via JSON
}
回答1:
A function or method cannot control the execution (control flow) from where it was called from. You don't even have guarantee it was called from your function, it may be called to initialize a global variable for example.
That being said it is the responsibility of the caller to end the execution and return, explicitly with the return
statement.
If the example is as simple as yours, you can avoid the return
statement though by using if-else
:
func apiEndpoint() {
if someCondition {
apiResponse("error")
} else {
apiResponse("all good")
}
}
Also if the functions have return values and the apiResponse()
would return a value that would be the return value of the caller, you can do the return
in one line, e.g.
func apiEndpoint() int {
if someCondition {
return apiResponse("error")
}
return apiResponse("all good")
}
func apiResponse(message string) int {
return 1 // Return an int
}
Note:
Just for completeness but not as a solution in your case: if the callee function would panic()
, the execution in the caller function would stop and the panicing sequence would go up in the call hierarchy (after running defer
functions, and if they don't call recover()
). Panic-recover is designed for something else and not as a mean for callee functions to stop executions in caller functions.
回答2:
Use the return
statement:
func apiEndpoint() {
if false {
apiResponse("error")
return
}
apiResponse("all good")
}
func apiResponse(message string) {
// returns message to user via JSON
}
来源:https://stackoverflow.com/questions/30858823/golang-how-to-return-in-func-from-another-func