Go語言同時提供了有符號和無符號類型的整數運算。這裏有int8、int16、int32和int64四種大相徑庭大小的有符號整數類型,分別對應八、1六、3二、64bit大小的有符號整數,與此對應的是uint8、uint16、uint32和uint64四種無符號整數類型。git
Unicode字符rune類型是和int32等價的類型,一般用於表示一個Unicode碼點。這兩個名稱能夠互換使用。一樣byte也是uint8類型的等價類型,byte類型通常用於強調數值是一個原始的數據而不是一個小的整數。函數
下面是Go語言中關於算術運算、邏輯運算和比較運算的二元運算符,它們按照優先級遞減的順序排列:ui
* / % << >> & &^ + - | ^ == != < <= > >= && ||
兩個相同的整數類型可使用下面的二元比較運算符進行比較;比較表達式的結果是布爾類型。編碼
== // 等於 != // 不等於 < // 小於 <= // 小於等於 > // 大於 >= // 大於等於
Go語言提供了兩種精度的浮點數,float32和float64。它們的算術規範由IEEE754浮點數國際標準定義,該浮點數規範被全部現代的CPU支持。操作系統
float32類型的浮點數能夠提供大約6個十進制數的精度,而float64則能夠提供約15個十進制數的精度;一般應該優先使用float64類型,由於float32類型的累計計算偏差很容易擴散,設計
var f float32 = 212213 fmt.Println(f == f + 1)
Go語言提供了兩種精度的複數類型:complex64和complex128,分別對應float32和float64兩種浮點數精度。內置的complex函數用於構建複數,內建的real和imag函數分別返回複數的實部和虛部:code
var x complex128 = complex(1, 2) // 1+2i var y complex128 = complex(3, 4) // 3+4i fmt.Println(x*y) // "(-5+10i)" fmt.Println(real(x*y)) // "-5" fmt.Println(imag(x*y)) // "10"
一個布爾類型的值只有兩種:true和false。if和for語句的條件部分都是布爾類型的值,而且==和<等比較操做也會產生布爾型的值, 布爾值能夠和&&(AND)和||(OR)操做符結合orm
!true // flase a := 10 a > 1 // true
一個字符串是一個不可改變的字節序列。字符串能夠包含任意的數據,包括byte值0,可是一般是用來包含人類可讀的文本。文本字符串一般被解釋爲採用UTF8編碼的Unicode碼點(rune)序列對象
s := "hello, world" fmt.Println(len(s)) // "12" len() 長度 fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')
字符串值也能夠用字符串面值方式編寫,只要將一系列字節序列包含在雙引號便可:blog
"Hello, 世界"
由於Go語言源文件老是用UTF8編碼,而且Go語言的文本字符串也以UTF8編碼的方式處理,所以咱們能夠將Unicode碼點也寫到字符串面值中。
在一個雙引號包含的字符串面值中,能夠用以反斜槓\
開頭的轉義序列插入任意的數據。下面的換行、回車和製表符等是常見的ASCII控制代碼的轉義方式:
\a 響鈴 \b 退格 \f 換頁 \n 換行 \r 回車 \t 製表符 \v 垂直製表符 \' 單引號 (只用在 '\'' 形式的rune符號面值中) \" 雙引號 (只用在 "..." 形式的字符串面值中) \\ 反斜槓
由於計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字才能處理。最先的計算機在設計時採用8個比特(bit)做爲一個字節(byte)。一個字節能表示的最大的整數就是255(2^8-1=255),而ASCII編碼,佔用0 - 127用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。
若是要表示中文,顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312編碼,用來把中文編進去。
相似的,日文和韓文等其餘語言也有這個問題。爲了統一全部文字的編碼,Unicode應運而生。Unicode把全部語言都統一到一套編碼裏,這樣就不會再有亂碼問題了。
Unicode一般用兩個字節表示一個字符,原有的英文編碼從單字節變成雙字節,只須要把高字節所有填爲0就能夠。
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是針對Unicode的一種可變長度字符編碼。它能夠用來表示Unicode標準中的任何字符,並且其編碼中的第一個字節仍與ASCII相容,使得原來處理ASCII字符的軟件無須或只進行少部份修改後,即可繼續使用。所以,它逐漸成爲電子郵件、網頁及其餘存儲或傳送文字的應用中,優先採用的編碼。
標準庫中有四個包對字符串處理尤其重要:bytes、strings、strconv和unicode包。
c:\foo\bar
等。除了字符串、字符、字節之間的轉換,字符串和數值之間的轉換也比較常見。由strconv包提供這類轉換功能。
將一個整數轉爲字符串,一種方法是用fmt.Sprintf返回一個格式化的字符串;另外一個方法是用strconv.Itoa(「整數到ASCII」):
x := 123 y := fmt.Sprintf("%d", x) fmt.Println(y, strconv.Itoa(x)) // "123 123"
FormatInt和FormatUint函數能夠用不一樣的進制來格式化數字:
fmt.Println(strconv.FormatInt(int64(x), 2)) // "1111011"
fmt.Printf函數的%b、%d、%o和%x等參數提供功能每每比strconv包的Format函數方便不少,特別是在須要包含附加額外信息的時候:
s := fmt.Sprintf("x=%b", x) // "x=1111011"
若是要將一個字符串解析爲整數,可使用strconv包的Atoi或ParseInt函數,還有用於解析無符號整數的ParseUint函數:
x, err := strconv.Atoi("123") // x is an int y, err := strconv.ParseInt("123", 10, 64) // base 10, up to 64 bits
ParseInt函數的第三個參數是用於指定整型數的大小;例如16表示int16,0則表示int。在任何狀況下,返回的結果y老是int64類型,你能夠經過強制類型轉換將它轉爲更小的整數類型。
常量表達式的值在編譯期計算,而不是在運行期。每種常量的潛在類型都是基礎類型:boolean、string、浮點型或整型。常量不可改變,一個常量的聲明也能夠包含一個類型和一個值,可是若是沒有顯式指明類型,那麼將從右邊的表達式推斷類型。
const 聲明:
const a = 10 // 整型 const p = 3.1415926 // 浮點型 const str = "zhaohaiyu" // 字符串 const flag = true // 布爾型
若是是批量聲明的常量,除了第一個外其它的常量右邊的初始化表達式均可以省略,若是省略初始化表達式則表示使用前面常量的初始化表達式寫法,對應的常量類型也同樣的。
const ( a = 1 b c = 2 d ) fmt.Println(a, b, c, d) // "1 1 2 2"
常量聲明可使用iota常量生成器初始化,它用於生成一組以類似規則初始化的常量,可是不用每行都寫一遍初始化表達式。在一個const聲明語句中,在第一個聲明的常量所在的行,iota將會被置爲0,而後在每個有常量聲明的行加一。
const ( a = 1 + iota b c d ) fmt.Println(a,b,c,d) // 1,2,3,4