callback就是把function A當作變數傳進另一個function B內。而執行B的時候就會callback回去參考A
舉例來說:
package main
import "fmt"
func visit(friends []string, callback func(string)) {
for _, n := range friends {
callback(n)
}
}
func main() {
visit([]string{"Tina", "James", "Mary"}, func(n string) {
fmt.Println(n)
})
}
可以看到在main裡面呼叫了visit,傳入了另一個function,而在執行visit中callback的時候又跑回來參考。
顧名思義就是function一直呼叫自己,記得要有停止條件,要不然就變無窮迴圈了。
package main
import "fmt"
func double(x int) int {
x = x * 2
if x > 64 {
return x
}
return double(x)
}
func main() {
fmt.Println(double(5))
}
這個範例會回傳x一直乘以二後第一個超過64的值
defer就是在整個function結束後才會執行,滿不錯用的
package main
import "fmt"
func hello() {
defer fmt.Println("Nice to meet you")
fmt.Println("Hello Tina")
}
func main() {
hello()
}
輸出結果會是;
Hello Tina
Nice to meet you
從這邊可以看到,雖然是nice to meet you在hello的第一行,但是加入defer後就會變成hello執行完才執行defer的內容
Go像C語言一樣有指標的概念,同樣可以傳遞
package main
import "fmt"
func change(x *string) {
*x = "Tom"
}
func main() {
name := "Troy"
fmt.Println(&name) // name的記憶體位置
change(&name) // 傳記憶體位置
fmt.Println(&name) // 記憶體位置不變
fmt.Println(name) // 但內容有變
}
自訂型別struct也是一樣可以傳的,其實也是傳pointer的概念
package main
import "fmt"
type stuff struct {
name string
price int
}
func main() {
p := stuff{"pancil", 10}
fmt.Println(p.price)
inprice(&p)
fmt.Println(p.price)
}
func inprice(s *stuff) {
s.price += 10
}
自己宣告完後自己用
package main
import "fmt"
func main() {
func() {
fmt.Println("lalala")
}()
}
記得function宣告完後要加()代表執行的意思