Go語言學習查缺補漏ing Day4

恆生LIGHT雲社群發表於2021-12-07

作者:ReganYue

來源: 恆生LIGHT雲社群

Go語言學習查缺補漏ing Day4

一、掌握iota的使用

請看下面這段程式碼:

package main


import "fmt"

const (
  a = iota
  _
  b
  c = "ReganYue"
  d
  d1
  e = iota
  f = iota
)

func main() {
  fmt.Println(a, b, c, d, d1, e, f)
}

思考一下輸出結果會是什麼?

先不公佈輸出結果。先來談一談iota,iota是用於給需要自增長常量賦值的識別符號。我們可以用下劃線 _ 來省略掉不想要的值。而我們中間給變數賦值了,然後如果後續的變數如果不賦值,後續的d,d1的值就會和c一樣。但是如果再次給一個變數標誌為iota,就又會賦值自增長的值,而且值從這裡第一個變數定義時就一直在自增長。

所以輸出結果是:

image-20211122134500118

我們再來看一看iota這個用法:

package main


import "fmt"

const (
  A, B = iota, iota + 1
  C, D
  E, F
)

func main() {
  fmt.Println(A, B, C, D, E, F)
}

執行結果是:

image-20211122134806337

iota是在下一行才進行增長,而不是每個變數都增長。

二、哪些型別的變數可以賦nil

var (

  A string = nil
  B int   = nil
  C interface{} = nil
  D chan int = nil
  E float64 = nil
  F func() = nil
  G []int = nil
  H map[int]int = nil
  I *int = nil
)

你知道上面哪些型別的變數可以賦nil值嗎?

顯然,A不是,字串的空值是"",而不是nil。B和E也不是,他們是數值型,值只能是數字。

而其它型別的變數,比如interface、chan、func、slice、map、指標都可以賦nil作為空值。

三、Golang的init函式

我們都知道main函式是Golang程式的入口函式,但是Golang還有一個特殊的函式init函式你可能不知道,它是先於main函式執行的,可以實現例如初始化包裡的變數等操作。

第一點應該知道的是:一個包可以有多個init函式,甚至一個go檔案都可以出現許多init函式。

第二點:同一個go檔案中的init函式是由上往下呼叫的,而同一個包中,init函式的呼叫順序是根據檔名的順序來呼叫的,至於不同包中的init函式呼叫順序,如果這些包之間不相互依賴的話,就是按照main包中import的順序呼叫,如果相互依賴那就是看誰先被依賴誰就最後被初始化。

第三點:init函式不能被賦值給函式變數,也不能呼叫,不然就會編譯失敗。

第四點:如果一個包被引用多次,那麼這個包只會執行init()函式一次。

四、將函式返回值賦值的一個注意事項

先來看一段程式碼:

package main


import "fmt"

func nh() []string {
  return nil
}
func main() {
  h := nh
  n := nh()
  if h == nil {
      fmt.Println("h is nil")
  } else {
      fmt.Println("h is not nil")
  }

  if n == nil {
      fmt.Println("n is nil")
  } else {
      fmt.Println("n is not nil")
  }
}

再來看看執行結果:

image-20211122143030943

顯然, h := nh 是將函式nh賦值給變數h,而 n := nh() 這樣看起來將函式賦值給n的操作是將函式nh的返回值給了n。所以h不是nil,而n是nil。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70001864/viewspace-2846105/,如需轉載,請註明出處,否則將追究法律責任。

相關文章