Home > Article > Backend Development > Can you Pass Function Calls as Arguments in Go?
Achieving Function Call-like Behavior in Go
In Go, keywords like go and defer expect functions to be passed as parameters. However, there's a limitation that prevents passing actual function calls.
Answer:
Unfortunately, there's no direct type that allows you to mimic function calls as arguments. go and defer are syntactic constructs backed by the language specification, and the compiler enforces this behavior.
Alternative Approach: Using Function Values
To bypass this limitation, you can use function values. A function value is a variable or value of type function. You can call function values later or at any time it's needed.
<code class="go">func myFunc() { fmt.Println("hi") } func main() { var f func() f = myFunc f() // This calls the function value stored in f, which is myFunc in this case }</code>
Emulating Automatic Parameter Saving
In the comments, you mentioned the desire for automatic parameter saving. Here's how you can achieve this using a helper function that provides a wrapped function with saved parameters:
<code class="go">func wrapPrintln(s string) func() { return func() { fmt.Println(s) } } func launch(f func()) { fmt.Println("Before launch") go func() { defer fmt.Println("After completion") f() }() } func main() { s := "Hello, playground" launch(wrapPrintln(s)) }</code>
Reflection as an Option
Reflection is another approach to handle this scenario, but it involves passing the function as an interface and using reflection to call it. This approach is less efficient than using function values but allows handling functions with varying signatures.
In conclusion, while there isn't a direct way to pass function calls as arguments, using function values or mimicking parameter saving through helper functions provides a workaround for achieving similar behavior.
The above is the detailed content of Can you Pass Function Calls as Arguments in Go?. For more information, please follow other related articles on the PHP Chinese website!