第 8 節:函式-函式型別與作用域

kuibatian發表於2019-11-26

6: 函式型別

package main

import "fmt"

func demo1(a int, b int) {
    fmt.Println(a + b)
}

//func (int,int)int函式型別
func demo2(s1 int, s2 int) {
    fmt.Println(s1 + s2)
}

//定義函式型別 為已存在的資料型別起別名
type FUNCDEMO func(int, int)

func main() {
    //demo1(10, 20)
    //函式的名字表示一個地址 函式在程式碼區的地址
    fmt.Println(demo1)

    //f是func (int,int)函式型別定義的變數
    //var f func(int, int)
    var f FUNCDEMO
    //函式型別定義的變數結束函式的地址
    f = demo1
    fmt.Println(f)
    //通過f呼叫函式
    f(10, 20)

    f = demo2
    f(1, 2)

    fmt.Printf("%T", f)
}

7: 07函式的作用域

package main

import "fmt"

//在函式外部定義的變數  成為全域性變數
//作用域是在專案中整個檔案去使用
//定義的全域性變數名不能和其他檔案中的全域性變數重名
//全域性變數名可以和區域性變數名重名
//全域性變數儲存在記憶體的資料區
//如果全域性變數定義時有值 儲存在初始化資料區 沒有值儲存在為初始化資料區
var a int = 10

func main0701() {
    //變數先定義後使用 在函式內部變數名是唯一的
    //在函式內部定義的變數 成為區域性變數
    //區域性變數的作用域在函式內部

    //a := 10
    //fmt.Println(a)
    //var i int = 10
    //for i = 0; i < 5; i++ {
    //  fmt.Println(i)
    //}
    //fmt.Println(i)

    //在go語言中會採用就進原則 如果在函式內部定義區域性變數 和全域性變數名重名 會使用區域性變數
    a := 123

    //修改全域性變數的值
    //如果全域性變數的值修改 會影響其他位置使用全域性變數的值
    a = 110
    fmt.Println(a)

    demo3()
}

func demo3() {
    fmt.Println(a)
}

func main() {

    //列印程式碼區的地址   程式碼區
    fmt.Println(demo3)
    //列印全域性變數的地址  資料區
    fmt.Println(&a)
    a := 10
    //列印區域性變數的地址  棧區
    fmt.Println(&a)
}

相關文章