小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Go語言|基本數(shù)據(jù)類型

 精品唯居 2022-12-23 發(fā)布于北京

基本類型

雖然從底層而言,所有的數(shù)據(jù)都是由比特組成,但計(jì)算機(jī)一般操作的是固定大小的數(shù),如整數(shù)、浮點(diǎn)數(shù)、比特?cái)?shù)組、內(nèi)存地址等。進(jìn)一步將這些數(shù)組織在一起,就可表達(dá)更多的對象,例如數(shù)據(jù)包、像素點(diǎn)、詩歌,甚至其他任何對象。Go語言提供了豐富的數(shù)據(jù)組織形式,這依賴于Go語言內(nèi)置的數(shù)據(jù)類型。這些內(nèi)置的數(shù)據(jù)類型,兼顧了硬件的特性和表達(dá)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的便捷性。

基本類型匯總

基本數(shù)據(jù)類型 長度(字節(jié)) 默認(rèn)值 說明
bool 1 false
byte 1 0 uint8
rune 4 0 Unicode Code Point, int32
int, uint 4或8 0 32 或 64 位
int8, uint8 1 0 -128 ~ 127, 0 ~ 255,byte是uint8 的別名
int16, uint16 2 0 -32768 ~ 32767, 0 ~ 65535
int32, uint32 4 0 -21億~ 21億, 0 ~ 42億,rune是int32 的別名
int64, uint64 8 0
float32 4 0.0
float64 8 0.0
complex64 8
complex128 16
uintptr 4或8 以存儲指針的 uint32 或 uint64 整數(shù)
復(fù)雜數(shù)據(jù)類型 長度(字節(jié)) 默認(rèn)值 說明
array 值類型
struct 值類型
string "" UTF-8 字符串
slice nil 引用類型
map nil 引用類型
channel nil 引用類型
interface nil 接口
function nil 函數(shù)

布爾類型

布爾型的值只可以是常量 true 或者 false
簡單定義:

    var b bool = true

兩個相同類型的值可以通過 == 或者 != 等比較運(yùn)算符號來獲得一個布爾類型的值。

布爾值并不會隱式轉(zhuǎn)換為數(shù)字值0或1,反之亦然。必須使用一個顯式的if語句輔助轉(zhuǎn)換:

// 布爾類型轉(zhuǎn)換為0或者1
func btoi(b bool) int{
    if b {
        return 1
    }
    return 0
}
// 數(shù)字轉(zhuǎn)換為布爾類型
func itob(i int) bool { return i != 0 }

整形

Go語言中整形被分為三大類:int 、uintuintptr
這三種類型的長度是跟據(jù)程序所在的操作系統(tǒng)來決定長度的:

  • intuint 在32位操作系統(tǒng)上,它們使用32位,4個字節(jié),在64拉操作系統(tǒng)上,它們使用64位,8個字節(jié)。
  • uintptr 的長度被設(shè)定為存儲指針的 uint32 或 uint64 整數(shù)

intuint又被稱為有符號整形和無符號整形
有符號整形:

  • int8(-128 -> 127)
  • int16(-32768 -> 32767)
  • int32(-2,147,483,648 -> 2,147,483,647)
  • int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)

無符號整形:

  • uint8(0 -> 255)
  • uint16(0 -> 65,535)
  • uint32(0 -> 4,294,967,295)
  • uint64(0 -> 18,446,744,073,709,551,615)

用不同的進(jìn)制來表示整數(shù):
十進(jìn)制:

    var Decimal int = 12

二進(jìn)制:

    var Binary int = 0b1100

八進(jìn)制:

    var Octal int = 0o14

十六進(jìn)制:

    var Hexadecimal int = 0xc

fmt.printf()函數(shù)進(jìn)行輸出:


    func main() {
        var Decimal int = 12
        var Binary int = 0b1100
        var Octal int = 0o14
        var Hexadecimal int = 0xCvar

        fmt.Printf("10進(jìn)制數(shù) %d 表示的是: %d \n", Decimal, Decimal)     //12
        fmt.Printf("2進(jìn)制數(shù) %b 表示的是: %d \n", Binary, Binary)           //12
        fmt.Printf("8進(jìn)制數(shù) %o 表示的是: %d \n", Octal, Octal)             //12
        fmt.Printf("16進(jìn)制數(shù) %X 表示的是: %d \n", Hexadecimal, Hexadecimal)    //12
    }

跟據(jù)上面的輸出可以發(fā)現(xiàn),在Go語言中使用二進(jìn)制、八進(jìn)制、十六進(jìn)制 非常的方便,只需要在數(shù)字前面加上:0b、0o0x 就可以使用。


補(bǔ)充:

fmt.Printf() 函數(shù)據(jù)的格式化功能:

%b 表示為二進(jìn)制
%c 該值對應(yīng)的unicode碼值
%d 表示為十進(jìn)制
%o 表示為八進(jìn)制
%q 該值對應(yīng)的單引號括起來的go語法字符字面值,必要時會采用安全的轉(zhuǎn)義表示
%x 表示為十六進(jìn)制,使用a-f
%X 表示為十六進(jìn)制,使用A-F
%U 表示為Unicode格式:U+1234,等價(jià)于"U+%04X"
%E 用科學(xué)計(jì)數(shù)法表示
%f 用浮點(diǎn)數(shù)表示

浮點(diǎn)型

Go語言支持兩種浮點(diǎn)型數(shù):float32float64。這兩種浮點(diǎn)型數(shù)據(jù)格式遵循 IEEE 754標(biāo)準(zhǔn)

  • float32(+- 1e-45 -> +- 3.4 * 1e38),可以使用常量定義:math.MaxFloat32。
  • float64(+- 5 1e-324 -> 107 1e308),可以使用一個常量定義:math.MaxFloat64

浮點(diǎn)型的零值為 0.0 ,在進(jìn)行除法運(yùn)算的時候,浮點(diǎn)型的零值可以為分母并且不會報(bào)錯,而整形的就會報(bào)錯。

float32 精確到小數(shù)點(diǎn)后 7 位,float64 精確到小數(shù)點(diǎn)后 15 位。由于精確度的緣故,你在使用 == 或者 != 來比較浮點(diǎn)數(shù)時應(yīng)當(dāng)非常小心。你最好在正式使用前測試對于精確度要求較高的運(yùn)算。也可以使用第三方包來完成這個操作。`go get github.com/shopspring/decimal

package main

func main() {
    var f float64 = 3.1415926
    fmt.Printf("保留兩個位小數(shù):%.2f",f)    //3.14
    fmt.Printf("保留兩個位小數(shù):%.3f",f)    //3.142
}

在日常使用中,我們經(jīng)常通常都使用 float64 來來定義浮點(diǎn)類型,因?yàn)?math 包里面,幾乎所有的方法,都支持 float64。
float64 轉(zhuǎn)換為 int 類型:

func IntFromFloat64(x float64) int {
    if math.MinInt32 <= x && x <= math.MaxInt32 { 
        whole, fraction := math.Modf(x)
        if fraction >= 0.5 {
            whole++
        }
        return int(whole)
    }
    panic(fmt.Sprintf("%g is out of the int32 range", x))
}

復(fù)數(shù)

復(fù)數(shù)分為:

    complex64 的實(shí)部和虛部為32位,
    complex128 的實(shí)部和虛部為64位。

復(fù)數(shù)的簡單使用:

    var c1 complex64 = 5 + 10i
    fmt.Printf("The complex64 is: %v", c1)
    // 輸出: 5 + 10i

函數(shù) real(c) 和 imag(c) 可以分別獲得相應(yīng)的實(shí)數(shù)和虛數(shù)部分。

byte 和 rune 類型

組成每個字符串的元素叫做字符,通過遍厲字符串或者定義單個字符可以獲取,定義字符時用 ' 包裹起來。

    var testRune := '國'
    var testByte := 'a'
    fmt.Printf("字符的類型為:%T",testRune)    //rune
    fmt.Printf("字符的類型為:%T",testRune)    //byte

使用中文或者一些特殊字符和Unicode編碼的時候,一般都推薦定義為 rune 類型。

rune 類型為 int32 的別名
byte 類型為 uint8 的別名范圍為 (0~255)

字符串

Go語言中的字符串以原生數(shù)據(jù)類型出現(xiàn),使用字符串就像使用其他原生數(shù)據(jù)類型(int、bool、float32、float64 等)一樣。 Go 語言里的字符串的內(nèi)部實(shí)現(xiàn)使用UTF-8編碼。 字符串的值為雙引號(")中的內(nèi)容,可以在Go語言的源碼中直接添加非ASCII碼字符,例如:

    var str string = "hello,世界!”

字符串其實(shí)多個是byte 類型和 rune 類型放在一起的類型,也就是 string 類型。


比如上面輸出的字符串hello ,在 ascii 編碼表中,每個字母對應(yīng)的編號是:104,101,108,108,111
如果這樣的話,我們就可以輸出一組 []byte 數(shù)組,來看一下 string 的底層是什么結(jié)構(gòu)。

    import (
        "fmt")

    func main() {
        var mystr01 string = "hello"
        var mystr02 [5]byte = [5]byte{104, 101, 108, 108, 111}
        fmt.Printf("mystr01: %s\n", mystr01)
        fmt.Printf("mystr02: %s", mystr02)
    }

輸出的結(jié)果為:

    mystr01: hello
    mystr02: hello

上面這個例子就說明了 string 類型的底層就是由一組 byte 類型的數(shù)組組成的。
那么就可以通過數(shù)組的自帶函數(shù)來獲取字符串的長度:

    import (
        "fmt")

    func main() {
        var mystr string = "hello"
        fmt.Printf("mystr: %d\n", len(mystr))
        // 結(jié)果為:mystr: 5
    }

Go 語言中,字符串之間可以直接通過 + 連接起來,例如:

    import (
        "fmt"
    )
    func main() {        
        s := "hel" + "lo," 
        s += "world!" 
        fmt.Println(s) 
        //輸出 “hello, world!”
    }

在遇到字符串?dāng)?shù)組時,也可以使用 Go 語言封裝好的方法 strings.Join() 或者使用字符緩沖 bytes.Buffer() 拼接都可以,并且效率也更高。

轉(zhuǎn)義字符

轉(zhuǎn)義字符 就是一類特殊字符,它們表示特殊的函意,可以用作輔助作用:

  • \n:換行符
  • \r:回車符
  • \t:tab 鍵
  • \u 或
  • \U:Unicode 字符
  • \:反斜杠自身

例如:

    import "fmt"

    func main() {
        str := "hello \n world"
        fmt.Println(str)
        // 輸出:
        //hello
        // world
    }

多行字符

在定義字符串的時候,可以使用 反引號 進(jìn)行包括,這樣就可以進(jìn)行多行字符串的編譯了,例如:

    import "fmt"

    func main() {
        str := `hello world 
    你好,世界`
        fmt.Println(str)
    }
    // 輸出:
    //hello world 
    //你好,世界


細(xì)節(jié)決定成敗!
個人愚見,如有不對,懇請扶正!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多