Byte Ebi's Logo

Byte Ebi 🍤

每天一小口,蝦米變鯨魚

[A Tour of Go 學習筆記] 02 變數與型別

使用官方教學瞭解 Go 語言變數與型別

Ray

初入 Golang 的世界,首先我們使用官方教學:A Tour of Go 來認識基本的 Golang 使用
這篇是變數與型別的筆記

變數

在 Go 語言中使用var來定義變數,並且和函數的參數列表一樣將型別定義在最後
var 聲明可以出現在 package 或是 function 的作用域內

package main

import "fmt"

var c, python, java bool

func main() {
	var i int
	fmt.Println(i, c, python, java)
}
/*
>>> 0 false false false
*/

變數預設值

在聲明變數的時後可以定義一個初始值
如果有定義初始值,在聲明的時候可以省略類型
Go 會根據初始值來推斷變數的型別,這點十分聰明!

package main

import "fmt"

// 主動定義變數型別
var i, j int = 1, 2

func main() {
    // 省略型別,透過預設值
	var c, python, java = true, false, "no!"
	fmt.Println(i, j, c, python, java)
}
/*
>>> 1 2 true false no!
*/

短變數聲明

在函數內可以使用:=來代替使用var聲明變數
在函數外部,每個語句都以關鍵字(var、func 等)開頭,不可使用:=

package main

import "fmt"

func main() {
	var i, j int = 1, 2
	k := 3
	c, python, java := true, false, "no!"

	fmt.Println(i, j, k, c, python, java)
}
/*
>>> 1 2 true false no!
*/

基本型別

Go 的基本型別有

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // alias for uint8

rune // alias for int32
     // represents a Unicode code point

float32 float64

complex64 complex128

一般來說intuintuintptr的長度和系統位元數一樣
在 32 位元系統中就是 32 位元;在 64 位元系統中就是 64 位元
當你需要整數的時候直接使用int就好
除非有明確的理由,否則不應該去限制長度

可以使用fmt.Printf套件來印出變數的格式化輸出內容,包含型別%T和值%v

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)
}

/*
>>> Type: bool Value: false
>>> Type: uint64 Value: 18446744073709551615
>>> Type: complex128 Value: (2+3i)
*/

Zero values

如果在聲明變數的時候沒有給定預設值
那就會被自動賦予 Zero value

不同型別的 Zero value 分別是

  • 數值型別:0
  • 布林型別:false
  • 字串型別:""(空字串)

型別轉換

使用T(v)的形式來將v型別轉換成T

例如:

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

或是可以使用更簡短的表達方式:

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

常數

  • 和變數的宣告方式很像,只是改為使用const
  • 內容可以是字元、字串、布林、或數值資料
  • 不能使用:=聲明

數值常數(Numeric constants)

  • 一種高精度的數值
  • 根據上下文使用來決定他的數值型別
import "fmt"

const (
    // 透過將 1 往左移動 100 位數來創造一個很大的數字(二進制中 1 後面接了 100 個 0)
    Big = 1 << 100
    // 再往左移 99 位元,變成二進制的「10」也就是十進制的 2
    Small = Big >> 99
)

func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
	return x * 0.1
}

func main() {
	fmt.Println(needInt(Small))
	fmt.Println(needFloat(Small))
	fmt.Println(needFloat(Big))
}

/*
>>> 21
>>> 0.2
>>> 1.2676506002282295e+29
*/

這時候如果印出needInt(Big)會發生什麼事情呢?

constant 1267650600228229401496703205376 overflows int

原來是因為我們所使用的系統中,最長的 int 就是 64-bit(有時候會更少)
而我們定義的數值常數Big是一個 100 位元的正數,所以就造成了 overflow

最新文章

Category

Tag