- 本篇前瞻
-
Leetcode習題9
- 題目描述
- 原題解析
- 代碼編寫
- 有符號整形
-
基本數(shù)據(jù)類型
-
整形
- 有符號整形
- 無符號整形
- 浮點型
- 布爾型
- 字符
-
整形
- 本篇小結(jié)
- 下一篇預告
本篇前瞻
歡迎來go語言的基礎篇,這里會幫你梳理一下go語言的基本類型,注意本篇有參考go圣經(jīng),如果你有完整學習的需求可以看一下。另外,go語言的基本類型比較簡單,介紹過程就比較粗暴,不過我們需要先從一個例題開始。
Leetcode習題9
先讓我們看下這個來自leetcode的例子,這個是一個比較好的例子,里面有一些關于整形的的知識
題目描述
9. 回文數(shù)
給你一個整數(shù) x
,如果 x
是一個回文整數(shù),返回 true
;否則,返回 false
。
回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)。
原題解析
注意原題中已經(jīng)提供了一個go語言的函數(shù)
func isPalindrome(x int) bool {
}
為了方便我們編寫代碼,我們只需要知道這個函數(shù)的輸入是x
,輸出是代表是否是回文數(shù)(是:true,否:false
),return
能返回輸出。
解題方法:
-
負數(shù)必然不是回文數(shù)。
-
對于非負整數(shù),我們循環(huán)
x除10
,通過x%10
獲得最低位,并且把最低位當作最高位加入到px
中,得到了x
的反轉(zhuǎn)過來的數(shù)px
-
判斷
px
和x
是否相等就可以了。
代碼編寫
使用int32
來計算px
, 將如下代碼提交,不行,答案錯誤,這是因為如果x=2147483647
,那么px=7463847412
,超出int32
的范圍了
func isPalindrome(x int) bool {
if x < 0 {
return false
}
x32 := int32(x)
px32 := int32(x)
for x32 != 0 {
px32 = px32*10 + x32%10
x32 /= 10
}
return px32 == int32(x)
}
那么換成int64
代碼如下,提交通過了,我們花費了28ms
,僅僅擊敗12%
的人,時間上有問題嗎?
func isPalindrome(x int) bool {
if (x < 0) {
return false
}
x64 := int64(x)
px64 := int64(0)
for x64 != 0 {
px64 = px64*10 + x64%10
x64 /= 10
}
return px64 == int64(x)
}
現(xiàn)在嘗試去掉int64
的強制轉(zhuǎn)化,居然通過了,只花費4ms
,擊敗了97%
的人,這不可思議!
func isPalindrome(x int) bool {
if (x < 0) {
return false
}
x64 := x //整形
px64 := 0
for x64 != 0 {
px64 = px64*10 + x64%10
x64 /= 10
}
return px64 == x //布爾型
}
有符號整形
這種整形就是可以表示負整數(shù),0和正整數(shù)
數(shù)據(jù)類型 | 占用空間(bit) | 長度(字節(jié)) | 取值范圍 |
---|---|---|---|
int8 | 8 | 1 | -2^7 ~ 2^7-1(-128~127) |
int16 | 16 | 2 | -2^15 ~ 2^15-1(-32768 ~ 32767) |
int32 | 32 | 4 | -2^32 ~ 2^32-1(-2147483648 ~ 2147483647) |
int64 | 64 | 8 | -2^64 ~ 2^64-1(-9223372036854775808 ~ 9223372036854775807) |
int | 32或64 | 4或8 | 同int32或int64 |
注意:int的占用空間取決于你的操作系統(tǒng)是32位或64位
那么利用這三次提交的結(jié)果,并結(jié)合有符號整形的知識,我們可以得出:
- 變量強制類型轉(zhuǎn)化會耗時
- 編程中的變量的取值范圍很重要
- Leetcode的判題系統(tǒng)是64位的
基本數(shù)據(jù)類型
從上面的例題中我們能發(fā)現(xiàn)數(shù)據(jù)類型的選擇在編程過程中有著決定性的作用,雖然這很基礎,但是決定了你的編程結(jié)果是否正確,選擇合適的類型會使你編寫的程序運行速度更快,占用內(nèi)存更小。
注意:由于復數(shù)類型
不常用的關系,本章節(jié)不會介紹該類型。
整形
這個不是韓國的“絕學”——整形術,整形在編程中可以表示一定范圍內(nèi)的整數(shù)
注意:int或uint的占用空間取決于你的操作系統(tǒng)是32位或64位
對于整形我們要關注的是數(shù)據(jù)類型的長度,數(shù)據(jù)范圍
代碼如下:
package main
import (
"fmt"
"math"
"unsafe"
)
func main() {
fmt.Printf("int8 length: %v range: %v ~ %v\n", unsafe.Sizeof(int8(1)), math.MinInt8, math.MaxInt8)
fmt.Printf("int16 length: %v range: %v ~ %v\n", unsafe.Sizeof(int16(1)), math.MinInt16, math.MaxInt16)
fmt.Printf("int32 length: %v range: %v ~ %v\n", unsafe.Sizeof(int32(1)), math.MinInt32, math.MaxInt32)
fmt.Printf("int64 length: %v range: %v ~ %v\n", unsafe.Sizeof(int64(1)), math.MinInt64, math.MaxInt64)
fmt.Printf("int length: %v\n", unsafe.Sizeof(int(1)))
fmt.Printf("uint8 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint8(1)), math.MaxUint8)
fmt.Printf("uint16 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint16(1)), math.MaxUint16)
fmt.Printf("uint32 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint32(1)), math.MaxUint32)
fmt.Printf("uint64 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint64(1)), uint64(math.MaxUint64))
fmt.Printf("uint length: %v\n", unsafe.Sizeof(uint(1)))
}
輸出:
int8 length: 1 range: -128 ~ 127
int16 length: 2 range: -32768 ~ 32767
int32 length: 4 range: -2147483648 ~ 2147483647
int64 length: 8 range: -9223372036854775808 ~ 9223372036854775807
int length: 8
uint8 length: 1 range: 0 ~ 255
uint16 length: 2 range: 0 ~ 65535
uint32 length: 4 range: 0 ~ 4294967295
uint64 length: 8 range: 0 ~ 18446744073709551615
uint length: 8
有符號整形
這種整形就是可以表示負整數(shù),0和正整數(shù)
數(shù)據(jù)類型 | 占用空間(bit) | 長度(字節(jié)) | 取值范圍 |
---|---|---|---|
int8 | 8 | 1 | -2^7 ~ 2^7-1(-128~127) |
int16 | 16 | 2 | -2^15 ~ 2^15-1(-32768 ~ 32767) |
int32 | 32 | 4 | -2^32 ~ 2^32-1(-2147483648 ~ 2147483647) |
int64 | 64 | 8 | -2^64 ~ 2^64-1(-9223372036854775808 ~ 9223372036854775807) |
int | 32或64 | 4或8 | 同int32或int64 |
無符號整形
這種整形就是可以表示非負整數(shù)
數(shù)據(jù)類型 | 占用空間(bit) | 長度(字節(jié)) | 取值范圍 |
---|---|---|---|
uint8 | 8 | 1 | 0 ~ 2^8-1(0 ~ 255) |
uint16 | 16 | 2 | 0 ~ 2^16-1(0 ~ 65535) |
uint32 | 32 | 4 | 0 ~ 2^32-1(0 ~ 4294967295) |
uint64 | 64 | 8 | 0 ~ 2^64-1(0 ~ 18446744073709551615) |
uint | 32或64 | 4或8 | 同uint32或uint64 |
浮點型
浮點型在編程中可以表示一定范圍內(nèi)的實數(shù)
注意:對于浮點型我們要關注的是數(shù)據(jù)類型的長度,數(shù)據(jù)范圍,但更要關注精度。
代碼如下:
package main
import (
"fmt"
"math"
"unsafe"
)
func main() {
fmt.Printf("float32 length: %v range: %v ~ %v\n", unsafe.Sizeof(float32(1)), -math.MaxFloat32, math.MaxFloat32)
fmt.Printf("float64 length: %v range: %v ~ %v\n", unsafe.Sizeof(float64(1)), -math.MaxFloat64, math.MaxFloat64)
fmt.Printf("after transfer float32 %v\n", float32(1.328))
fmt.Printf("after transfer float64 %v\n", float64(float32(1.328)))
}
輸出:
float32 length: 4 range: -3.4028234663852886e+38 ~ 3.4028234663852886e+38
float64 length: 8 range: -1.7976931348623157e+308 ~ 1.7976931348623157e+308
before transfer float32: 1.328
after transfer float64: 1.3279999494552612
你可以看到1.328在float32強制轉(zhuǎn)化為float64反常地失去了一些精度,當然這就是為啥項目和數(shù)據(jù)庫只有高精度實數(shù)的原因,你可以想象在這種情況時使用乘法后可怕的結(jié)果。
至于這個產(chǎn)生的原因時浮點32型和浮點64型在計算機上表示方式不同,這部分內(nèi)容你可以查看《計算機程序的構造和解釋》。
列表如下:
數(shù)據(jù)類型 | 占用空間(bit) | 長度(字節(jié)) | 取值范圍 |
---|---|---|---|
float32 | 32 | 4 | -3.4028234663852886e+38 ~ 3.4028234663852886e+38 |
float64 | 64 | 8 | -1.7976931348623157e+308 ~ 1.7976931348623157e+308 |
布爾型
最簡單的類型
注意:分支語句中的if后面的表達式的結(jié)果值是true或false
代碼如下:
package main
import (
"fmt"
"unsafe"
)
func main() {
fmt.Printf("bool length: %v %v/%v", unsafe.Sizeof(true), 0 == 0, 0 != 0)
}
輸出:
bool length: 1 true/false
列表如下:
數(shù)據(jù)類型 | 占用空間(bit) | 長度(字節(jié)) | 取值范圍 |
---|---|---|---|
bool | 1 | 1 | true/false |
字符
注意:byte是包含ascii碼,即uint8 ,rune是可以包含utf-8的,即uint32
代碼如下:
package main
import (
"fmt"
"unsafe"
)
func main() {
fmt.Printf("byte length: %v %v %c\n", unsafe.Sizeof(byte('a')),byte('a'),byte('a'))
fmt.Printf("rune length: %v %v %c\n", unsafe.Sizeof(rune('中')),rune('中'),rune('中'))
}
輸出:
byte length: 1 97 a
rune length: 4 20013 中
列表如下:
數(shù)據(jù)類型 | 占用空間(bit) | 長度(字節(jié)) | 取值范圍 |
---|---|---|---|
byte | 8 | 1 | 0 ~ 2^8-1(0 ~ 255) |
rune | 32 | 4 | 0 ~ 2^32-1(0 ~ 4294967295) |
本篇小結(jié)
很好,你已經(jīng)閱讀完了go的基本數(shù)據(jù)類型!看是不是簡單?學習go語言其實比較簡單,你先通過例題知道了選擇基礎數(shù)據(jù)類型的重要性,然后通過基本數(shù)據(jù)類型,你知道了每個類型都有自己的長度,取值范圍和注意點,最后相關代碼房子在go語言學習的go-base/2中,你需要編寫這些代碼來實踐一下go語言。文章來源:http://www.zghlxwxcb.cn/news/detail-658429.html
下一篇預告
go語言的控制結(jié)構文章來源地址http://www.zghlxwxcb.cn/news/detail-658429.html
到了這里,關于2.如何選擇go語言基礎類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!