不想淪為芸芸眾生的人只需做一件事,便是對自己不再散漫;他應當聽從良知的呼喚:“成為你自己!”
---尼采
1、整型
有符號整數類型:int8、int16、int32和int64
無符號整數類型:uint8、uint16、uint32和uint64
跟CPU平台相關的數據類型:有符號整數int和無符號整數uint
特殊的無符號整數類型:uintptr(同指針),在32位平台下4字節,在64位平台下8字節
1.1 類型表示
int、uint和uintptr是不同類型的兄弟類型,int和int32也不是相同的類型,編譯器不會幫你自動做類型轉換,需要強制類型轉換。比如:
var apples int32 = 1
var oranges int16 = 2
var compote int = apples + oranges //compile error
當編譯時,會產生一個錯誤信息:
invalid operation: apples + oranges (mismatched types int32 and int16)
解決方法是將他們都顯式轉型為一個常見類型:
var compote = int(apples) + int(oranges)
1.2 比較運算
兩個不同類型的整數型不能直接比較,但各種類型的整型變量都可以直接與字面常量進行比較。
var i int32 var j int64 i, j = 1, 2
if i == j { //編譯錯誤 fmt.Println("i and j are equal.") } if i == 1 || j == 2 { //編譯通過 fmt.Println("i and j are equal.") }
2、浮點數
如何判斷兩個浮點數是否相等?浮點數不是一種精確地表達方式,所以像整型那樣直接用 == 來判斷兩個浮點數是否相等是不可行的。應該采用下面的方法:
package main
import ( "fmt"
"math" ) const MIN = 0.000001
// MIN 為用戶自定義的比較精度
func IsEqual(f1, f2 float64) bool { return math.Dim(f1, f2) < MIN }
func main() { a := 0.0000123 b := 0.000012234
if IsEqual(a, b) { fmt.Println("a < b") } }
3、布爾類型
布爾值可以和&&(AND)和||(OR)操作符結合,並且有短路行為:如果運算符左邊值已經可以確定整個布爾表達式的值,那么運算符右邊的值將不再被求值,因此下面的表達式總是安全的:
s != "" && s[0] == 'x'
其中s[0]操作如果應用於空字符串將會導致panic異常。
4、常量
常量表達式值在編譯時期計算,而不是在運行時期。
所有常量的運算都可以在編譯期完成,這樣可以減少運行時的工作,也方便其他編譯優化。當操作數是常量時,一些運行時的錯誤也可以在編譯時被發現,例如整數除零、字符串索引越界、任何導致無效浮點數的操作等。
4.1 iota常量生成器
常量聲明可以使用iota常量生成器初始化,它用於生成一組以相似規則初始化的常量,但是不用每行都寫一遍初始化表達式。在一個const聲明語句中,在第一個聲明的常量所在的行,iota將會被置為0,然后在每一個有常量聲明的行加一。
下面是來自time包的例子,它首先定義了一個Weekday命名類型,然后為一周的每天定義了一個常量,從周日0開始。在其它編程語言中,這種類型一般被稱為枚舉類型。
type Weekday int
const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday )
5、字符串
在Go語言中,字符串也是一種基本類型。
字符串連接:x + y; "Hello" + "123",結果為"Hello123"
字符串長度:len(s)