Golang functions: Difference between revisions
From wikinotes
Line 39: | Line 39: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Deferred functions are executed in the order of '''last-in-first-out''' ('''LIFO'''). | * Deferred functions are executed in the order of '''last-in-first-out''' ('''LIFO'''). | ||
* Panics evaluate '''after''' deferred functions | |||
Variables passed to a defferred function retain their value at the time the function call was made. | Variables passed to a defferred function retain their value at the time the function call was made. |
Revision as of 00:59, 6 June 2022
Function Signatures
Function with arguments, return value
// (param type) (return-type) func greet(name string) string { return "Hello, " + name }Multiple return values
// when multiple return values present, surround with brackets func find(id int) (string, int) { // ... } // optionally, return values can be named // (this has no implications for caller, it's simply documentation) func find(id int) (name string, age int) { // ... }
Deferred evaluation
Defer waits until a function is just about to exit (even on failure).
This is similar to a try/finally block in other languages.
Docs describe it as useful for releasing a mutex, for example.func WriteFile(filepath string) (success int) { fd, err := os.Open(filepath) defer fd.Close() // run before function closes // ... other code ... }
- Deferred functions are executed in the order of last-in-first-out (LIFO).
- Panics evaluate after deferred functions
Variables passed to a defferred function retain their value at the time the function call was made.
func main() { a := "start" defer fmt.Println(a) b := "end" } // "start" <-- 'a' at time of defer was 'start'