GO的第四天,基礎數據類型

Go語言將數據類型分爲四類:基礎類型、複合類型、引用類型和接口類型。基礎類型,包括:數字、字符串和布爾型。今天咱們大致上講下這幾種:整型,浮點數,布爾型,字符串型,常量。《GO語言聖經》裏還介紹了一種,那就是複數,爲何我不講複數呢?主要有兩個緣由,第一個緣由:感受基本上不經常使用。第二個緣由:本人的數學知識都已經還給老師了。php

好了,很少廢話,咱們開始吧!python

整型

Go語言同時提供了有符號和無符號類型的整數運算。這裏有int八、int1六、int32和int64四種大相徑庭大小的有符號整數類型,分別對應八、1六、3二、64bit大小的有符號整數,與此對應的是uint八、uint1六、uint32和uint64四種無符號整數類型。這幾個有什麼區別呢,咱們看代碼,你就基本能夠知道了。git

var u uint8 = 255
fmt.Println(u, u+1, u*u) // "255 0 1"

var i int8 = 127
fmt.Println(i, i+1, i*i) // "127 -128 1"

其中有符號整數採用2的補碼形式表示,也就是最高bit位用來表示符號位,一個n-bit的有符號數的值域是從$-2^{n-1}$到$2^{n-1}-1$。無符號整數的全部bit位都用於表示非負數,值域是0到$2^n-1$。例如,int8類型整數的 值域 是從-128到127,而uint8類型整數的 值域 是從0到255。編程

浮點數

浮點數的範圍極限值能夠在math包找到。常量math.MaxFloat32表示float32能表示的最大數值,大約是 3.4e38;對應的math.MaxFloat64常量大約是1.8e308。它們分別能表示的最小值近似爲1.4e-45和4.9e-324。
浮點數的字面值能夠直接寫小數部分,像這樣:數組

const e = 2.71828 // (approximately)

小或很大的數最好用科學計數法書寫,經過e或E來指定指數部分:緩存

const Avogadro = 6.02214129e23  // 阿伏伽德羅常數
const Planck   = 6.62606957e-34 // 普朗克常數

布爾型

一個布爾類型的值只有兩種:true和false。
布爾值並不會隱式轉換爲數字值0或1,反之亦然。必須使用一個顯式的if語句輔助轉換。若是須要常常作相似的轉換, 包裝成一個函數會更方便:app

func btoi(b bool) int {
    if b {
        return 1
    }
    return 0
}

數字到布爾型的逆轉換則很是簡單, 不過爲了保持對稱, 咱們也能夠包裝一個函數:編程語言

func itob(i int) bool { return i != 0 }

字符串

一個字符串是一個 不可改變 的字節序列。GO的字符串操做跟python的字符串操做差很少。函數

s := "hello, world"
fmt.Println(len(s))     // "12"
fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')
fmt.Println(s[0:5]) // "hello"

子字符串操做s[i:j]基於原始的s字符串的第i個字節開始到第j個字節(並不包含j自己)生成一個新字符串。生成的新字符串將包含j-i個字節。
無論i仍是j均可能被忽略,當它們被忽略時將採用0做爲開始位置,採用len(s)做爲結束的位置。ui

fmt.Println(s[:5]) // "hello"
fmt.Println(s[7:]) // "world"
fmt.Println(s[:])  // "hello, world"

字符串面值

這個通俗的講就是php當中的heredoc,PHP當中是這樣用的:

<?php
    echo <<<EOF
    Thisis a Headline
    Thisis the first line.
    Thisis the second line.
EOF;

一個原生的字符串面值形式是`...`,使用反引號代替雙引號。go的語法:

const GoUsage = `Go is a tool for managing Go source code.

Usage:
    go command [arguments]
...`

字符串與Byte切片

一個字符串是包含的 只讀字節數組,一旦建立,是 不可變的。相比之下,一個字節slice的元素則能夠 自由地修改
字符串和字節slice之間能夠相互轉換:

s := "abc"
b := []byte(s)
s2 := string(b)

標準庫中有四個包對字符串處理尤其重要:bytesstringsstrconvunicode包。strings包提供了許多如字符串的查詢、替換、比較、截斷、拆分和合並等功能。

bytes包也提供了不少相似功能的函數,可是針對和字符串有着相同結構的[]byte類型。由於字符串是隻讀的,所以逐步構建字符串會致使不少分配和複製。在這種狀況下,使用bytes.Buffer類型將會更有效。

strconv包提供了布爾型、整型數、浮點數和對應字符串的相互轉換,還提供了雙引號轉義相關的轉換。

unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等相似功能,它們用於給字符分類。每一個函數有一個單一的rune類型的參數,而後返回一個布爾值。而像ToUpper和ToLower之類的轉換函數將用於rune字符的大小寫轉換。全部的這些函數都是遵循Unicode標準定義的字母、數字等分類規範。strings包也有相似的函數,它們是ToUpper和ToLower,將原始字符串的每一個字符都作相應的轉換,而後返回新的字符串。

bytes包還提供了Buffer類型用於字節slice的緩存。一個Buffer開始是空的,可是隨着string、byte或[]byte等類型數據的寫入能夠動態增加,一個bytes.Buffer變量並不須要初始化,由於零值也是有效的:

// intsToString is like fmt.Sprint(values) but adds commas.
func intsToString(values []int) string {
    var buf bytes.Buffer
    buf.WriteByte('[')
    for i, v := range values {
        if i > 0 {
            buf.WriteString(", ")
        }
        fmt.Fprintf(&buf, "%d", v)
    }
    buf.WriteByte(']')
    return buf.String()
}

func main() {
    fmt.Println(intsToString([]int{1, 2, 3})) // "[1, 2, 3]"
}

常量

常量表達式的值在 編譯期 計算,而不是在 運行期。每種常量的潛在類型都是基礎類型:boolean、string或數字。

const pi = 3.14159

和變量聲明同樣,能夠批量聲明多個常量;這比較適合聲明一組相關的常量:

const (
    e  = 2.71828182845904523536028747135266249775724709369995957496696763
    pi = 3.14159265358979323846264338327950288419716939937510582097494459
)

常量間的全部 算術運算邏輯運算比較運算 的結果也是常量,對常量的類型轉換操做或如下函數調用都是返回常量結果:len、cap、real、imag、complex和unsafe.Sizeof。

一個常量的聲明也能夠包含一個類型和一個值,可是若是沒有顯式指明類型,那麼將從右邊的表達式推斷類型。

const noDelay time.Duration = 0
fmt.Printf("%T %[1]v\n", noDelay)   // time.Duration 0

iota常量生成器

常量聲明可使用 iota常量生成器 初始化,它用於生成一組以 類似規則 初始化的常量,可是不用每行都寫一遍初始化表達式。在一個const聲明語句中,在第一個聲明的常量所在的行,iota將會被置爲0,而後在每個有常量聲明的行加一。

下面是來自time包的例子,它首先定義了一個Weekday命名類型,而後爲一週的天天定義了一個常量,從週日0開始。在其它編程語言中,這種類型通常被稱爲枚舉類型。

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

週日將對應0,週一爲1,如此等等。

參考

《GO語言聖經》

相關文章
相關標籤/搜索