順序程式設計4

2021-08-14 06:31:20 字數 3678 閱讀 8872

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...