Go語言之旅:基本型別

weixin_33850890發表於2018-08-14

原文地址:https://learn-linux.readthedocs.io
歡迎關注我們的公眾號:小菜學程式設計 (coding-fan)

Go 內建了以下基本型別:

  • 布林

    • bool
  • 字串

    • string
  • 整數

    • int int8 int16 int32 int64
    • uint uint8 uint16 uint32 uint64
  • 位元組

    • byteuint8 的別名
  • Unicode

    • runeint32 別名
  • 浮點

    • float32 float64
  • 複數

    • complex64 complex128
package main

import (
    "fmt"
    "math/cmplx"
)

var (
    ToBe    bool        = false
    MaxInt  uint64      = 1 << 64 -1
    z       complex128  = cmplx.Sqrt(-5 +12i)
)

func main() {
    fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe)
    fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt)
    fmt.Printf("Type: %T Value: %v\n", z, z)
}

執行結果如下:

$ go run basic-types.go
Type: bool Value: false
Type: uint64 Value: 18446744073709551615
Type: complex128 Value: (2+3i)

例子展示了幾種不同型別變數的用法。 注意到,跟 import語句 一樣,變數申明可以批量寫到一個程式碼塊裡。

一般來說,intuint 以及 uintptr 型別在 32 位機器上是 32 位長; 在 64 位機器上則是 64 位長。 需要使用整數時, int 型別是首選, 除非你有特別的理由一定要用 定長 或者 無符號 型別。

零值

變數申明時沒有顯式賦初始值,則預設是“ ”。

不同的型別有不同的“ ”:

  • 對於數值型別是 0
  • 對於布林型別是 false
  • 對於字串型別是 "" (空字串);
package main

import "fmt"

func main() {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
}

執行結果如下:

$ go run zero.go
0 0 false ""

型別轉換

表示式 ( expression ) T(v) 將值 v 轉換成型別 T , 這就是所謂的 型別轉換 ( type conversions )。

這是一些數值型別轉換:

var i int = 42
var f float64 = float64(i)
var u uint = uint(f)

或者簡寫成:

i := 42
f := float(i)
u := uint(f)

C 語言有所不同, Go 在不同型別之間賦值,需要顯式型別轉換。 不信,將下面例子中 float64unit 型別轉換移除,看看發生什麼?

package main

import (
    "fmt"
    "math"
)

func main() {
    var x, y int = 3, 4
    var f float64 = math.Sqrt(float64(x*x + y*y))
    var z uint = uint(f)
    fmt.Println(x, y, z)
}

執行結果如下:

$ go run type-conversions.go
3 4 5

型別推理

變數型別通過右邊的值推理而來。

如果申明右邊的值是有型別的,那麼新變數也是一樣的型別:

var i int
j := i  // j is an int as well

如果右邊只是一個數值常量,沒有具體型別,那麼新變數可能是 intfloat64 以及 complex128 三種型別中的一種,取決於常量的精度。

i := 42             // int
f := 3.142          // float64
g := 0.867 + 0.5i   // complex128

接下來做個實驗吧! 改變例子中 v 的初始值,觀察它是如何影響變數型別的:

package main

import "fmt"

func main() {
    v := 42     // change me!
    fmt.Printf("v is of type %T\n", v)
}

下一步

下一節 我們一起來看看 Go 語言 常量

訂閱更新,獲取更多學習資料,請關注我們的 微信公眾號

2740477-99d3bcd298eee1f7.png
小菜學程式設計

相關文章