個人理解的是,go裏面的變量和const修飾的常量其實是不同的概念,做了一個徹底的區分。
對變量的定義:引入了關鍵字var對變量進行聲明
var a int
var b string
var c float64
var e [4] int // 數組
var f [] int //數組切片
var f * int //正確
var v1 int = 5 //正確
var v2 = 5 //正確,編譯器自動推導出V2類型
v3 := 5 //正確,編譯器自動推導出V3的類型
多重賦值
Go語言提供了大多數的語言所不支持的多重賦值,使得變量的的變換變得十分簡單,多重賦值的一個例子,就是不要像c語言一樣使用中間的變量
i := 2
j := 3
i , j = i , i //交換i與j的值
變量的類型
獲取變量的大小
//使用unsafe
package main
import (
"fmt"
"unsafe"
)
func main(){
var a int64 = 10000
fmt.Println("length of a : " , unsafe.Sizeof(a))
}
布爾類型
Go語言提供內置的布爾值true和false,Go語言支持標準的邏輯比較和比較操作,但是操作結果都是布爾值。在go裏面是不允許將其他的類型轉換爲bool類型的,比如int類型。必須使用false以及true。
var f * int //正確
var v1 int = 5 //正確
var v2 = 5 //正確,編譯器自動推導出V2類型
v3 := 5 //正確,編譯器自動推導出V3的類型
字符串
go的字符串和c裏面的不同,使用的是UTF-8的一個序列,不再是ASCII,因爲UTF-8的編碼不定長比較靈活,所以一個字符串的大小也可能是1到4個字節。Go 這樣做的好處是不僅減少了內存和硬盤空間佔用,同時也不用像其它語言那樣需要對使用 UTF-8 字符集的文本進行編碼和解碼。
t1 := "\"hello world\""
t2 := "\u5b32\u8FCE"
t2 := `"hello"`
轉義字符 | 含義 |
---|---|
\\ | 表示反斜線 |
' | 單引號 |
" | 雙引號 |
\n | 換行符 |
\uhhhh | 4 個 16 進制數字給定的 Unicode 字符 |
在 Go 語言中單個字符可以使用單引號( ' )來創建。之前的課程中,我們有學習過rune
類型,它等同於int32
,在 Go 語言中,一個單一的字符可以用一個單一的rune
來表示。這也是容易理解的,因爲 Go 語言的字符串是 UTF-8 編碼,其底層使用 4 個字節表示,也就是 32 bit。
在 Go 語言中,字符串支持切片操作,但是需要注意的是如果字符串都是由 ASCII 字符組成,那可以隨便使用切片進行操作,但是如果字符串中包含其他非 ASCII 字符,直接使用切片獲取想要的單個字符時需要十分小心,因爲對字符串直接使用切片時是通過字節進行索引的,但是非 ASCII 字符在內存中可能不是由一個字節組成。如果想對字符串中字符依次訪問,可以使用range操作符。另外獲取字符串的長度可能有兩種含義,一種是指獲取字符串的字節長度,一種是指獲取字符串的字符數量。
字符串支持以下操作:
語法 | 描述 |
---|---|
s += t | 將字符串 t 追加到 s 末尾 |
s + t | 將字符串 s 和 t 級聯 |
s[n] | 從字符串 s 中索引位置爲 n 處的原始字節 |
s[n:m] | 從位置 n 到位置 m-1 處取得的字符(字節)串 |
s[n:] | 從位置 n 到位置 len(s)-1 處取得的字符(字節)串 |
s[:m] | 從位置 0 到位置 m-1 處取得的字符(字節)串 |
len(s) | 字符串 s 中的字節數 |
len([]rune(s)) | 字符串 s 中字符的個數,可以使用更快的方法 utf8.RuneCountInString() |
[ ]rune(s) | 將字符串 s 轉換爲一個 unicode 值組成的串 |
string(chars) | chars 類型是[]rune 或者[]int32, 將之轉換爲字符串 |
[ ]byte(s) | 無副本的將字符串 s 轉換爲一個原始的字節的切片數組,不保證轉換的字節是合法的 UTF-8 編碼字節 |