變數


  // 標準方式
  var name string = "Lester"

  // 一次宣告多個
  var i, j, k int

  // 一次宣告多種,不同 type
  var b ,f , s = true, 2.3, "four"

  // 常見的使用(Open function 回了兩個變數)
  var f, err = os.Open(name)

  // 短變數宣告
  freq := rand.Float64() * 3.0
  name := "Lester"

指標

指標(pointer)是變數的(address)

  // 宣告變數 x 型別為 int 值為 1
  x := 1
  // 宣告變數 p 型別為 *int 值為 &x (我們可以理解為 p 是 x 的地址)
  // 我們也可以知道我們可以透過 &{你的變數} 來取得該變數的 Address
  p := &x
  // 因為 p 型別為 *int ,當我們使用 *p 時就會取得該變數的值
  fmt.Println(*p) // 1
  // 同上,我們可以透過 *p 來 set value
  *p = 2
  fmt.Println(x) // 2

任何型別的指標的零值為 nil 。

  var x, y int
  fmt.Println(&x == &x, &x == &y, &x == nil) // true, false, false

指標可以被當參數傳入,也可作為參數被傳出


  func incr(i *int){
    *i++
  }

  func returnPointer(i int) *int{
    return &i
  }

new 函式

new 為另外一種建構變數的方式,但建構出來的變數為 不具名變數

  p := new(int) // 建立型別為 int 的不具名變數回傳型別為 *int
  fmt.Println(*p) // 0
  *p = 2
  fmt.Println(*p) // 2

變數的生命週期

特別要注意的情況

  var global *int
  func f(){
    var x int
    x = 1
    global = &x
  }

上面的例子來說 x 並不是個區域變數了。因為我們最後還是可以透過 *global 去設值或是取值。