Go 語(yǔ)言具有嚴(yán)格的靜態(tài)類(lèi)型限制方库,運(yùn)算符操作的數(shù)字類(lèi)型必須是相同類(lèi)型數(shù)據(jù)。且數(shù)字操作不能超出該類(lèi)型的取值范圍弯院,不然計(jì)算溢出得到的結(jié)果就是錯(cuò)的辱士。
一、加減乘除听绳、取模
package main
import "fmt"
func main() {
// 加 +
var ui1, ui2 uint8
ui1 = 1
ui2 = 2
ui := ui1 + ui2
fmt.Println(ui) // 輸出:3
ui += 255
fmt.Println(ui) // 溢出后計(jì)算的值就是錯(cuò)的颂碘,輸出:2
// 減 -
var i, j int32
i = 10
j = 5
fmt.Println(i - j) // 輸出:5
// 乘 *
var f1, f2 float32
f1 = 1.2
f2 = 0.2
// 浮點(diǎn)型的數(shù)字計(jì)算有精度問(wèn)題,float32 精度6位小數(shù)辫红,float64 精度15位小數(shù)凭涂,
fmt.Println(f1 * f2) // 輸出:0.24000001
// 除 /
n1 := 10
n2 := 3
fmt.Println(n1 / n2) // 輸出:3,小數(shù)被丟棄
// 求模贴妻、取余 %
fmt.Println(n1 % n2) // 輸出余數(shù):1
}
二切油、位運(yùn)算
位運(yùn)算是直接對(duì)數(shù)字在內(nèi)存中存儲(chǔ)的二進(jìn)制數(shù)進(jìn)行操作,所以性能上來(lái)講是最快的運(yùn)算方式名惩。位運(yùn)算一般常見(jiàn)于需要性能優(yōu)化或復(fù)雜的算法中澎胡。位運(yùn)算只作用于整數(shù)類(lèi)型上。
Go 語(yǔ)言中的位運(yùn)算符:
運(yùn)算符 | 釋義 | 運(yùn)算規(guī)則 |
---|---|---|
& | 按位與娩鹉,兩個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制位相與 | 同時(shí)為1攻谁,則為1,否則為0 |
| | 按位或弯予,兩個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制位相或 | 有一個(gè)為1戚宦,則為1,否則為0 |
^ | 按位異或锈嫩,兩個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制位相異或 | 二進(jìn)制位不同受楼,則為1,否則為0 |
&^ | 按位清空 | x&^y 如果ybit位上的數(shù)是0則取x上對(duì)應(yīng)位置的值呼寸,如果ybit位上為1則結(jié)果位上取0 |
<< | 左移 | 所有二進(jìn)制位左移運(yùn)算符右邊指定的位數(shù)艳汽,高位丟棄,低位補(bǔ)0对雪。左移n位就是乘以2的n次方 |
>> | 右移 | 所有二進(jìn)制位右移運(yùn)算符右邊指定的位數(shù)河狐,高位補(bǔ)0,低位丟棄瑟捣。右移n位就是除以2的n次方 |
package main
import "fmt"
func main() {
var i1, i2, n uint8 // 1個(gè)字節(jié)
// 按位與 &
i1 = 2 // 二進(jìn)制:0000 0010
i2 = 3 // 二進(jìn)制:0000 0011
n = i1 & i2 // 按位與:0000 0010
fmt.Println(n) // 輸出:2
// 按位或 |
i1 = 10 // 二進(jìn)制:0000 1010
i2 = 20 // 二進(jìn)制:0001 0100
n = i1 | i2 // 按位或:0001 1110
fmt.Println(n) // 輸出:30
// 按位異或 ^
i1 = 3 // 二進(jìn)制:0000 0011
i2 = 4 // 二進(jìn)制:0000 0100
n = i1 ^ i2 // 按位異或:0000 0111
fmt.Println(n) // 輸出:7
// 按位清空 &^
i1 = 10 // 二進(jìn)制:0000 1010
i2 = 20 // 二進(jìn)制:0001 0100
n = i1 &^ i2 // 按位清空:0000 1010
fmt.Println(n) // 輸出:10
// 左移 <<
i1 = 5 // 二進(jìn)制 0000 0101
n = i1 << 2 // 左移2位:0001 0100
fmt.Println(n) // 輸出:20
// 右移 >>
i2 = 15 // 二進(jìn)制:0000 1111
n = i2 >> 2 // 右移2位:0000 0011
fmt.Println(n) // 輸出:3
}
三馋艺、比較大小
大小比較得到的類(lèi)型時(shí)布爾型。運(yùn)算符:>
大于迈套、>=
大于等于丈钙、<
小于、<=
小于等于交汤、==
等于雏赦。
package main
import "fmt"
func main() {
fmt.Println(2 > 1) // 輸出:true
fmt.Println(1 == 2) // 輸出:false
}
四劫笙、數(shù)字類(lèi)型轉(zhuǎn)換
整型從高位類(lèi)型轉(zhuǎn)低位類(lèi)型會(huì)有精度丟失,浮點(diǎn)型轉(zhuǎn)整型會(huì)丟失小數(shù)點(diǎn)后的值星岗,復(fù)數(shù)型轉(zhuǎn)非復(fù)數(shù)整型時(shí)符號(hào)丟失填大。數(shù)據(jù)類(lèi)型轉(zhuǎn)換格式:目標(biāo)類(lèi)型(轉(zhuǎn)換類(lèi)型)
package main
import "fmt"
func main() {
// 整型轉(zhuǎn)浮點(diǎn)型
var i int = 1
fmt.Printf("%f\n", float32(i)) // 輸出:1.000000
// 浮點(diǎn)型轉(zhuǎn)整型
var f float32 = 3.1415926
fmt.Printf("%d\n", int(f)) // 輸出:3,小數(shù)后丟失
// float32 轉(zhuǎn) float64
fmt.Printf("%v\n", float64(f)) // 輸出:3.141592502593994俏橘,6位后的小數(shù)精度是錯(cuò)誤的
// float64 轉(zhuǎn) float32
var f2 float64 = 3.141592653589793
fmt.Println("%v\n", float32(f2)) // 輸出:3.1415927允华,6位后的小數(shù)精度是錯(cuò)誤的
}
五、數(shù)字轉(zhuǎn)字符串
使用 strconv 包中定義的函數(shù)做數(shù)字和字符串轉(zhuǎn)換寥掐。
package main
import (
"fmt"
"strconv"
)
func main() {
// int 轉(zhuǎn) string
var i int = 111
var s string
s = strconv.Itoa(i) // 數(shù)字轉(zhuǎn)字符串
fmt.Println(s)
// string 轉(zhuǎn) int
i2, err := strconv.ParseInt(s, 10, 64) // 把 s 轉(zhuǎn)為10進(jìn)制64位數(shù)
if err == nil {
fmt.Println(i2) // 輸出:111
}
// float 轉(zhuǎn) string
var f float64 = 3.1415926535
s1 := strconv.FormatFloat(f, 'f', -1, 64)
fmt.Println(s1) // 輸出:3.1415926535
// 第二個(gè)參數(shù)選項(xiàng)靴寂,含義如下:
// 'b' (-ddddp±ddd,二進(jìn)制指數(shù))
// 'e' (-d.dddde±dd召耘,十進(jìn)制指數(shù))
// 'E' (-d.ddddE±dd百炬,十進(jìn)制指數(shù))
// 'f' (-ddd.dddd,沒(méi)有指數(shù))
// 'g' ('e':大指數(shù)污它,'f':其它情況)
// 'G' ('E':大指數(shù)剖踊,'f':其它情況)
// string 轉(zhuǎn) float
str := `3.1415926535`
v1, err := strconv.ParseFloat(str, 32) // ParseFloat 函數(shù)默認(rèn)返回float64類(lèi)型數(shù)據(jù),轉(zhuǎn)成folat32可能會(huì)有精度丟失
if err == nil {
fmt.Printf("%v\n", v1) // 輸出:3.1415927410125732
}
v2, err := strconv.ParseFloat(str, 64)
if err == nil {
fmt.Printf("%v\n", v2) // 輸出:3.1415926535
}
}