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宣告完後要加()代表執行的意思