go 的基本型別主要有 7 種 3 種數值型別(int、float、complex),以及 boo、string、byte、rune.而 3 種數值型別又根據不同的位元數做分類.
整數又分為帶正負號的整數,另外 int32 跟 rune 是同義的,rune 用來指該值為 Unicode :
int int8 int16 int32 int64
無正負號的整數,而 uint8 跟 byte 是同義的,byte 用來強調該值的原始資料而不是數值 :
uint uint8 uint16 uint32 uint64 uintptr
浮點數分為 32 及 64 :
float32 float64
複數分為 64 及 128 :
complex64 complex128
在 Go 的 +、-、*、/都可用在整數、浮點數、及複數上,但只有餘數運算子(%)只能用在整數上且正負號與被除數相同.
fmt.Println(-10 % 4) // -2
fmt.Println(-10 % -4) // -2
fmt.Println(10 % -4) // 2
如果經過運算後位元數超過型別的範圍則會發生 overflow.
uint8 的範圍為 0~255,int8 的範圍為 -182 ~ 127.
var u uint8 = 255
fmt.Println(u, u+1, u+2) // 255 0 1
var i int8 = 127
fmt.Println(i, i+1, i+2) // 127 -128 -127
浮點數通常以 Printf 的 %g 輸出,%g 會選擇適合的精確度表示,也可以透過 %e (指數)或 %f (無指數)表示.
%23.16f 表示 16 位精確度的 e 次方值,並以 23 個字元寬顯示.
package main
import (
"fmt"
)
func main() {
var c = 3.14159265358979323846264
fmt.Printf("c : %g , %e , %23.16f ,%25.23f ", c, c, c, c)
// c : 3.141592653589793 , 3.141593e+00 , 3.1415926535897931 ,3.14159265358979311599796
}
複數的運算如下,(1 + 2i) * (3 + 4i) = 3 + 4i + 6i + 8(-1) = -5 + 10i,
-5 是實數透過 real() 取出,10 是實數透過 imag() 取出
package main
import (
"fmt"
)
func main() {
var c1 complex128 = complex(1, 2)
var c2 complex128 = complex(3, 4)
fmt.Println(c1 + c2) // (4+6i)
fmt.Println(c1 - c2) // (-2-2i)
var c3 = c1 * c2
fmt.Println(c3) // (-5+10i)
fmt.Println(real(c3)) // -5
fmt.Println(imag(c3)) // 10
}