標籤:條件 port 小數點 方式 筆記二 指標 字串 通過 條件判斷語句
基本類型:
布爾型:boolean
整型:int8,byte,int16,int,uint,uintptr等
浮點型:float32,float64
複數類型:complex64,complex128
字串型:string
字元型:rune
錯誤類型:error
複合類型:
指標:pointer
數組:array
切片:slice
字典:map
通道:chan
結構體:struct
介面:interface
1、布爾型,與其他語言中的布爾型一樣
2、整型:
a、類型表示
需要注意的是,int和int32在Go語言裡被認為是兩種不同的類型,編譯器也不會幫你自動 做類型轉換,比如以下的例子會有編譯錯誤:
var value2 int32
value1 := 64 // value1將會被自動推導為int類型 value2 = value1 // 編譯錯誤
編譯錯誤類似於:
cannot use value1 (type int) as type int32 in assignment。 使用強制類型轉換可以解決這個編譯錯誤:
value2 = int32(value1) // 編譯通過 當然,開發人員在做強制類型轉換時,需要注意資料長度被截短而發生的資料精度損失(比如
將浮點數強制轉為整數)和值溢出(值超過轉換的目標類型的值範圍時)問題。
b、數值運算
Go語言支援下面的常規整數運算:+、?、*、/和%。加減乘除就不詳細解釋了,需要說下的 是,% 和在C語言中一樣是求餘運算,比如:
5%3 // 結果為:2
c、比較運算
Go語言支援以下的幾種比較子:>、<、==、>=、<=和!=。這一點與大多數其他語言相 同,與C語言完全一致。
下面為條件判斷語句的例子:
i, j := 1, 2 if i == j { fmt.Println("i and j are equal.") }
兩個不同類型的整型數不能直接比較,比如int8類型的數和int類型的數不能直接比較,但
各種類型的整型變數都可以直接與字面常量(literal)進行比較,比如:
var i int32var j int64i, j = 1, 2if i==j{ // 編譯錯誤 fmt.Println("i and j are equal.")}if i==1||j==2{// 編譯通過 fmt.Println("i and j are equal.")}
d、位元運算
Go語言的大多數位元運算符與C語言都比較類似,除了取反在C語言中是~x,而在Go語言中 是^x。
3、浮點型:
浮點型用於表示包含小數點的資料,比如1.234就是一個浮點型資料。Go語言中的浮點類型 採用IEEE-754標準的表達方式。
a、 浮點數表示
Go語言定義了兩個類型float32和float64,其中float32等價於C語言的float類型, float64等價於C語言的double類型。
在Go語言裡,定義一個浮點數變數的代碼如下:
var fvalue1 float32fvalue1 = 12fvalue2 := 12.0 // 如果不加小數點,fvalue2會被推導為整型而不是浮點型
對於以上例子中類型被自動推導的fvalue2,需要注意的是其類型將被自動設為float64, 而不管賦給它的數字是否是用32位長度表示的。因此,對於以上的例子,下面的賦值將導致編譯 錯誤:
fvalue1 = fvalue2
而必須使用這樣的強制類型轉換:
fvalue1 = float32(fvalue2)
b、浮點數比較
因為浮點數不是一種精確的表達方式,所以像整型那樣直接用==來判斷兩個浮點數是否相等 是不可行的,這可能會導致不穩定的結果。
下面是一種推薦的替代方案:
import "math"// p為使用者自訂的比較精度,比如0.00001
func IsEqual(f1, f2, p float64) bool { return math.Fdim(f1, f2) < p
}
4、複數類型:
複數實際上由兩個實數(在電腦中用浮點數表示)構成,一個表示實部(real),一個表示 虛部(imag)。如果瞭解了數學上的複數是怎麼回事,那麼Go語言的複數就非常容易理解了。
a、複數表示 複數表示的樣本如下:
var value1 complex64value1 = 3.2 + 12i // 由2個float32構成的複數類型 value2 := 3.2 + 12i // value2是complex128類型value3 := complex(3.2, 12) // value3結果同 value2
b、實部與虛部
對於一個複數z = complex(x, y),就可以通過Go語言內建函數real(z)獲得該複數的實 部,也就是x,通過imag(z)獲得該複數的虛部,也就是y。
更多關於複數的函數,請查閱math/cmplx標準庫的文檔。
5、字串:
Go語言中字串的聲明和初始化非常簡單,舉例如下:
var str string // 聲明一個字串變數str = "Hello world" // 字串賦值ch := str[0] // 取字串的第一個字元fmt.Printf("The length of \"%s\" is %d \n", str, len(str)) fmt.Printf("The first character of \"%s\" is %c.\n", str, ch)輸出結果為: The length of "Hello world" is 11 The first character of "Hello world" is H.
字串的內容可以用類似於數組下標的方式擷取,但與數組不同,字串的內容不能在初始 化後被修改,比如以下的例子:
str := "Hello world" // 字串也支援聲明時進行初始化的做法
str[0] = ‘X‘ // 編譯錯誤
編譯器會報類似如下的錯誤:
cannot assign to str[0]
a、字串操作
平時常用的字串操作如表2-3所示。
更多的字串操作,請參考標準庫strings包。
b、字串遍曆
Go語言支援兩種方式遍曆字串。一種是以位元組數組的方式遍曆:
str := "Hello,世界"n := len(str)for i := 0; i < n; i++ {ch := str[i] // 依據下標取字串中的字元,類型為byte fmt.Println(i, ch)}
另一種是以Unicode字元遍曆:
str := "Hello,世界"for i, ch := range str {fmt.Println(i, ch)//ch的類型為rune }
以Unicode字元方式遍曆時,每個字元的類型是rune(早期的Go語言用int類型表示Unicode 字元),而不是byte。
6、字元類型:
在Go語言中支援兩個字元類型,一個是byte(實際上是uint8的別名),代表UTF-8字串的單個位元組的值;另一個是rune,代表單個Unicode字元。 關於rune相關的操作,可查閱Go標準庫的unicode包。另外unicode/utf8包也提供了
UTF8和Unicode之間的轉換。 出於簡化語言的考慮,Go語言的多數API都假設字串為UTF-8編碼。儘管Unicode字元在標準庫中有支援,但實際上較少使用。
未完待續。。。
【GO】GO語言學習筆記二