3.3 浮點型
浮點型用於表示包含小數點的資料,比如1.234就是乙個浮點型資料。go語言中的浮點型別採用ieee-754
標準的表達方式。
(1)浮點數表示
go語言定義了兩個型別 float32 和 float64 ,其中 float32 等價於c語言的 float 型別,
float64 等價於c語言的 double 型別。
在go語言裡,定義乙個浮點數變數的**如下:
var fvalue1 float32
fvalue1 = 12
fvalue2 := 12.0 // 如果不加小數點,fvalue2會被推導為整型而不是浮點型
對於以上例子中型別被自動推導的 fvalue2 ,需要注意的是其型別將被自動設為 float64 ,而不管賦給它
的數字是否是用32位長度表示的。因此,對於以上的例子,下面的賦值將導致編譯錯誤:
fvalue1 = fvalue
而必須使用這樣的強制型別轉換:fvalue1 = float32(fvalue2)
(2)浮點數比較
因為浮點數不是一種精確的表達方式,所以像整型那樣直接用 == 來判斷兩個浮點數是否相等
是不可行的,這可能會導致不穩定的結果。
下面是一種推薦的替代方案:
import "math"
func isequal(f1, f2, p float64) bool
3.4 複數型別
複數實際上由兩個實數(在計算機中用浮點數表示)構成,乙個表示實部(real),乙個表示虛部(imag)。
如果了解了數學上的複數是怎麼回事,那麼go語言的複數就非常容易理解了。
(1)複數表示
複數表示的示例如下:
var value1 complex64 // 由2個float32構成的複數型別
value1 = 3.2 + 12i
value2 := 3.2 + 12i // value2是complex128型別
value3 := complex(3.2, 12) // value3結果同 value2
(2)實部與虛部
對於乙個複數 z = complex(x, y) ,就可以通過go語言內建函式 real(z) 獲得該複數的實部,也就是 x ,
通過 imag(z) 獲得該複數的虛部,也就是 y 。
更多關於複數的函式,請查閱 math/cmplx 標準庫的文件。
3.5 字串
在go語言中,字串也是一種基本型別。相比之下, c/c++語言中並不存在原生的字串型別,
通常使用字元陣列來表示,並以字元指標來傳遞。
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]
在這個例子中我們使用了乙個go語言內建的函式 len() 來取字串的長度。這個函式非常有
用,我們在實際開發過程中處理字串、陣列和切片時將會經常用到。
本節中還順便示範了 printf() 函式的用法。有c語言基礎的讀者會發現, printf() 函
數的用法與c語言執行庫中的 printf() 函式如出一轍。在以後學習更多的go語言特性時,
可以配合使用 println() 和 printf() 來列印各種自己感興趣的資訊。
go編譯器支援utf-8的源**檔案格式。這意味著源**中的字串可以包含非ansi的字
符,比如「hello world. 你好,世界!」可以出現在go**中。但需要注意的是,如果go代
碼需要包含非ansi字元,儲存原始檔時請注意編碼格式必須選擇utf-8。特別是在windows下一
般編輯器都預設存為本地編碼,比如中國地區可能是gbk編碼而不是utf-8,如果沒注意這點在
編譯和執行時就會出現一些意料之外的情況。
字串的編碼轉換是處理文字文件(比如txt、xml、html等)非常常見的需求,不過可
惜的是go語言僅支援utf-8和unicode編碼。對於其他編碼,go語言標準庫並沒有內建的編碼轉
換支援。不過,所幸的是我們可以很容易基於 iconv 庫用cgo包裝乙個。這裡有乙個開源專案:
這個開源專案在書上看到的,還沒怎麼研究看。
(1)字串操作
平時常用的字串操作如表2-3所示。
(2) 字串遍歷
go語言支援兩種方式遍歷字串。一種是以位元組陣列的方式遍歷:
str := "hello,世界"
n := len(str)
for i := 0; i < n; i++
這個例子的輸出結果為:
0 72
1 101
2 108
3 108
4 111
5 44
6 32
7 228
8 184
9 150
10 231
11 149
12 140
可以看出,這個字串長度為13。儘管從直觀上來說,這個字串應該只有9個字元。這是
因為每個中文字元在utf-8中佔3個位元組,而不是1個位元組。另一種是以unicode字元遍歷:
str := "hello,世界"
for i, ch := range str
輸出結果為:
0 72
1 101
2 108
3 108
4 111
5 44
6 32
7 19990
10 30028
以unicode字元方式遍歷時,每個字元的型別是 rune (早期的go語言用 int 型別表示unicode
字元),而不是 byte 。
3.6 字元型別
在go語言中支援兩個字元型別,乙個是 byte (實際上是 uint8 的別名),代表utf-8字串
的單個位元組的值;另乙個是 rune ,代表單個unicode字元。
關於 rune 相關的操作,可查閱go標準庫的 unicode 包。另外 unicode/utf8 包也提供了
utf8和unicode之間的轉換。
出於簡化語言的考慮,go語言的多數api都假設字串為utf-8編碼。儘管unicode字元在標
準庫中有支援,但實際上較少使用。
順序程式設計
那麼倒是什麼順序程式設計呢?從程式流程的角度來看,程式可以分為三種基本結構,即順序結構 分支結構 迴圈結構。這三種基本結構可以組成所有的各種複雜程式。c語句分為五類 1 表示式 由表示式加上分號 例如x y z 就叫賦值語句。2.函式呼叫語句 由函式名 實際引數加上分號 形式為 函式名 實際參數列 ...
c程式設計 順序程式設計
c語言主要特點 資料型別豐富 資料 資訊的符號化 常量 整型常量 10 實型常量 1 十進位制小數形式,123.456 2 指數形式,12.34e3 字元常量1 普通字元,a 單撇號只是界限符,字 符常量只能是乙個字元 2 轉移字元.的意思是將後面的轉換成另外的意思,n換行 字串常量 boy 雙撇號...
順序程式設計介紹
本篇將介紹基礎的流程控制語法 常用遞迴函式慣用的例項 介紹如何使用erlang自帶的偵錯程式。例項 module main export auto 0 auto io format hello the world.x 1,2,3,4,5 io format list size is p n list...