Go語言中數(shù)值類型包括幾種不同大小的整數(shù)、浮點(diǎn)數(shù)和復(fù)數(shù)锡搜。每種數(shù)值類型都決定了對(duì)應(yīng)的大小范圍和是否支持正負(fù)符號(hào)橙困。
整數(shù)
Go語言提供了5種有符號(hào)、5種無符號(hào)耕餐、1種指針凡傅、1種單字節(jié)、1種單個(gè)unicode字符(unicode碼點(diǎn))肠缔,共13種整數(shù)類型,默認(rèn)值(零值)均為0.
int, uint, rune, int8, int16, int32, int64, uint8, uint16, uint32, uint64, byte, uintptr
序號(hào) | 類型和描述 |
---|---|
1 | uint8 無符號(hào) 8 位整型 (0 到 255) |
2 | uint16 無符號(hào) 16 位整型 (0 到 65535) |
3 | uint32 無符號(hào) 32 位整型 (0 到 4294967295) |
4 | uint64 無符號(hào) 64 位整型 (0 到 18446744073709551615) |
5 | int8 有符號(hào) 8 位整型 (-128 到 127) |
6 | int16 有符號(hào) 16 位整型 (-32768 到 32767) |
7 | int32 有符號(hào) 32 位整型 (-2147483648 到 2147483647) |
8 | int64 有符號(hào) 64 位整型 (-9223372036854775808 到 9223372036854775807) |
9 | byte 類似 uint8 |
10 | rune 類似 int32夏跷,通常表示一個(gè)unicode碼點(diǎn) |
11 | uint 32 或 64 位 |
12 | int 與 uint 一樣大小 |
13 | uintptr 無符號(hào)整型,用于存放一個(gè)指針 |
整數(shù)定義
示例
package main
import "fmt"
func main() {
/*
整數(shù)類型
標(biāo)識(shí)符: int桩砰、int*拓春、uint释簿、uint*亚隅、uintptr、byte
字面量: 十進(jìn)制庶溶、八進(jìn)制0777(7*8^2 +7*8^1 + 7*8^0)煮纵、十六進(jìn)制 0X0-9A-F
*/
// 整數(shù)定義
var age int = 18
// 簡(jiǎn)短定義
ages := 19
fmt.Printf("%T,%d\n", age, age)
fmt.Printf("%T,%d\n", ages, ages)
fmt.Println(0777) // 8進(jìn)制
fmt.Println(0x10) // 16進(jìn)制
}
下面是Go語言中關(guān)于算術(shù)運(yùn)算懂鸵、邏輯運(yùn)算和比較運(yùn)算的二元運(yùn)算符:
算術(shù)運(yùn)算符 + - * / % ++ --
關(guān)系運(yùn)算符 < <= > >= == != 比較表達(dá)式的結(jié)果是布爾類型。
bit位運(yùn)算符 & | ^ &^ << >>
賦值運(yùn)算符:=行疏、+=匆光、-=、*=酿联、/=终息、%=、&=贞让、|=周崭、^=、<<=喳张、>>=
算術(shù)運(yùn)算符+续镇、-、*和/可以適用于整數(shù)销部、浮點(diǎn)數(shù)和復(fù)數(shù)摸航,但是取模運(yùn)算符%僅用于整數(shù)間的運(yùn)算。
在Go語言中舅桩,%取模運(yùn)算符的符號(hào)和被取模數(shù)的符號(hào)總是一致的酱虎,因此-5%3和-5%-3結(jié)果都是-2。
除法運(yùn)算符/的行為則依賴于操作數(shù)是否全為整數(shù)擂涛,比如5.0/4.0的結(jié)果是1.25逢净,但是5/4的結(jié)果是1,因?yàn)檎麛?shù)除法會(huì)向著0方向截?cái)嘤鄶?shù)歼指。
運(yùn)算示例
package main
import "fmt"
func main() {
/*
整數(shù)操作
算術(shù)運(yùn)算(+, -, *, /, %, ++, --)
關(guān)系運(yùn)算(==, !=, >, >=, <, <=)
位運(yùn)算
賦值運(yùn)算(=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, &^=)
*/
// 算術(shù)運(yùn)算(+, -, *, /, %, ++, --)
fmt.Println(1 + 2)
fmt.Println(3 - 10)
fmt.Println(3 * 9)
fmt.Println(9 / 2) // 結(jié)果為4, 取整
fmt.Println(9.0 / 2) // 結(jié)果為4.5
fmt.Println(9 / 2.0) // 結(jié)果為4.5
fmt.Println(9 % 2)
// fmt.Println(9 / 0) // 除數(shù)不能為0
fmt.Println(0 / 9)
var age int = 18
// 自增和自減只能在后面
age++
fmt.Println(age)
age--
fmt.Println(age)
// 關(guān)系運(yùn)算(==, !=, >, >=, <, <=)
fmt.Println(2 == 3)
fmt.Println(2 != 3)
fmt.Println(2 > 3)
fmt.Println(2 >= 3)
fmt.Println(2 < 3)
fmt.Println(2 <= 3)
/*
位運(yùn)算 二進(jìn)制的運(yùn)算 10 => 2
& | ^ << >> &^
十進(jìn)制 => 2 7/2 => 1 3/2 =>1 1/2 =>1 0 0111
2 = > 0010
與 7 & 2 => 0111 & 0010 => 0010 => 2
或 7 | 2 => 0111 | 0010 => 0111 => 7
非 7 ^ 2 => 0111 ^ 0010 => 0101 => 5
左移 2 << 1 => 0010 << 1 => 0100 => 4
右移 2 >> 1 => 0010 >> 1 => 0001 => 1
按位與或 7 &^ 2 => 0111 &^ 0010 => 0101 => 5
*/
fmt.Println(7 & 2)
fmt.Println(7 | 2)
fmt.Println(7 ^ 2)
fmt.Println(2 << 1)
fmt.Println(2 >> 1)
fmt.Println(7 &^ 2)
// 賦值運(yùn)算(=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, &^=)
// a += b ==> a = a + b
age = 1
age += 3 // age = age +3
fmt.Println(age)
// int/uint/byte/rune/int* 類型不同爹土,不能運(yùn)算,必須強(qiáng)制轉(zhuǎn)換
var intA int = 10
var uintB uint = 3
fmt.Println(intA + int(uintB))
fmt.Println(uint(intA) + uintB)
var apples int32 = 1
var oranges int16 = 2
var compote = int(apples) + int(oranges)
fmt.Println(compote)
// 大 -> 小 轉(zhuǎn)換可能出現(xiàn)溢出
var intC int = 0xFFFF
fmt.Println(intC, uint8(intC), int8(intC))
f := 3.141 // a float64
k := int(f)
fmt.Println(f, k) // "3.141 3"
f = 1.99
fmt.Println(int(f)) // "1"
}
類型轉(zhuǎn)換
Go 不會(huì)對(duì)自動(dòng)對(duì)數(shù)據(jù)類型轉(zhuǎn)換踩身,因此左胀茵、右操作數(shù)類型必須一致或某個(gè)字面量,可通過類型名(數(shù)據(jù))的語法將數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)類型挟阻。需要注意值截?cái)嗪椭狄绯鰡栴}琼娘。
package main
import "fmt"
func main() {
// int、uint附鸽、byte脱拼、rune、int* 類型不同坷备,不能運(yùn)算熄浓,必須強(qiáng)制轉(zhuǎn)換
var intA int = 10
var uintB uint = 3
fmt.Println(intA + int(uintB))
fmt.Println(uint(intA) + uintB)
var apples int32 = 1
var oranges int16 = 2
var compote = int(apples) + int(oranges)
fmt.Println(compote)
// 大 -> 小 轉(zhuǎn)換可能出現(xiàn)溢出
var intC int = 0xFFFF
fmt.Println(intC, uint8(intC), int8(intC))
f := 3.141 // a float64
k := int(f)
fmt.Println(f, k) // "3.141 3"
f = 1.99
fmt.Println(int(f)) // "1"
}
使用 fmt.Printf 進(jìn)行格式化參數(shù)輸出,占位符:
%b: 二進(jìn)制
%c: 字符
%d: 十進(jìn)制
%+d 表示對(duì)正整數(shù)帶+符號(hào)
%nd 表示最小占位 n 個(gè)寬度且右對(duì)齊
%-nd 表示最小占位 n 個(gè)寬度且左對(duì)齊
%0nd 表示最小占位 n 個(gè)寬度且右對(duì)齊省撑,空字符使用 0 填充
%o:八進(jìn)制赌蔑,%#o 帶 0 的前綴
%x俯在、%X:十六進(jìn)制,%#x(%#X)帶 0x(0X)的前綴
%U: Unicode 碼點(diǎn),%#U 帶字符的 Unicode 碼點(diǎn)
%q:帶單引號(hào)的字符
格式化示例:
package main
import "fmt"
func main() {
/*
fmt.Printf
int娃惯、uint跷乐、int*、uint*
byte, rune
*/
var a byte = 'A'
var w rune = '中'
fmt.Println(a, w)
age := 21
fmt.Printf("%T %d %b %o %x\n", age, age, age, age, age) // %b二進(jìn)制 %o八進(jìn)制 %x16進(jìn)制
fmt.Printf("%T %c\n", a, a) // %c 字節(jié)
fmt.Printf("%T %q %U\n", w, w, w) // %q %U 碼點(diǎn)
fmt.Printf("%5d\n", age) // 占位5個(gè)
fmt.Printf("%-5d\n", age) // 左對(duì)齊并占位5個(gè)
fmt.Printf("%05d\n", age) // 占位5個(gè)趾浅,用0補(bǔ)齊
ascii := 'a'
unicode := '國'
newline := '\n'
fmt.Printf("%d %[1]c %[1]q\n", ascii) // "97 a 'a'"
fmt.Printf("%d %[1]c %[1]q\n", unicode) // "22269 國 '國'"
fmt.Printf("%d %[1]q\n", newline) // "10 '\n'"
}
浮點(diǎn)數(shù)類型
Go語言提供了兩種精度的浮點(diǎn)數(shù)愕提,float32和float64。
package main
import "fmt"
func main() {
/*
float32,float64
字面量: 十進(jìn)制表示法 科學(xué)技術(shù)表示法
M E N => M * 10 ^ N
1.9 E -1 => 0.19
*/
//定義
var height float64 = 1.68
fmt.Printf("%T %.2f\n", height, height)
var weight float64 = 14.18e1
fmt.Println(weight)
// 操作
// 算術(shù)運(yùn)算(+, -, *, /, ++, --)
fmt.Println(1.1 + 1.2)
fmt.Println(1.1 - 1.2)
fmt.Println(1.1 * 1.2)
fmt.Println(1.1 / 1.2)
height++
fmt.Println(height)
height--
fmt.Println(height)
height++
fmt.Println(height)
height--
fmt.Println(height)
// 關(guān)系運(yùn)算 (> >= < <=)
fmt.Println(1.1 > 1.2)
fmt.Println(1.1 >= 1.2)
fmt.Println(1.1 < 1.2)
fmt.Println(1.1 <= 1.2)
fmt.Println(1.2-1.1 <= 0.005)
// 賦值運(yùn)算(=, +=, -=, /= *=)
height += 0.5
fmt.Println(height)
// 類型轉(zhuǎn)換
fmt.Printf("%T, %T\n", 1.1, float32(1.1))
fmt.Printf("%5.2f\n", height)
}