go語言初記2(備忘)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

 看《Go入門指南》 ,這裡講得比較基礎,針對go 1.0版,以下是一些我自己覺得特別和不容易理解的地方的摘抄!

 

 上次有說到go裡不同類型之間操作必須顯示轉換,int和uint不固定,所以int 不是int32

  • int 和 uint 在 32 位作業系統上,它們均使用 32 位(4 個位元組),在 64 位元作業系統上,它們均使用 64 位元(8 個位元組)。
    package mainfunc main() {    var a int    var b int32    a = 15    b = a + a    // 編譯錯誤    b = b + 5    // 因為 5 是常量,所以可以通過編譯 }

格式化說明符(應該不止這些)

在格式化字串裡,%d 用于格式化整數(%x 和 %X 用于格式化 16 進位表示的數字),%g 用于格式化浮點型(%f 輸出浮點數,%e 輸出科學計數標記法),%0d 用於規定輸出定長的整數,其中開頭的數字 0 是必須的。

%n.mg 用於表示數字 n 並精確到小數點後 m 位,除了使用 g 之外,還可以使用 e 或者 f,例如:使用格式化字串 %5.2e 來輸出 3.4 的結果為 3.40e+00

%b 是用於表示位的格式化標識符。

 

 

4.5.2.3 位元運算 (備檔)

位元運算只能用於整數類型的變數,且需當它們擁有等長位元模式時。

%b 是用於表示位的格式化標識符。

二元運算子

  • 按位與 &

    對應位置上的值經過和運算結果,具體參見和運算子,第 4.5.1 節,並將 T(true)替換為 1,將 F(false)替換為 0

    1 & 1 -> 11 & 0 -> 00 & 1 -> 00 & 0 -> 0
  • 按位或 |

    對應位置上的值經過或運算結果,具體參見或運算子,第 4.5.1 節,並將 T(true)替換為 1,將 F(false)替換為 0

    1 | 1 -> 11 | 0 -> 10 | 1 -> 10 | 0 -> 0
  • 按位異或 ^

    對應位置上的值根據以下規則群組合:

    1 ^ 1 -> 01 ^ 0 -> 10 ^ 1 -> 10 ^ 0 -> 0
  • 位清除 &^:將指定位置上的值設定為 0。

一元運算子

  • 按位補足 ^

    該運算子與異或運算子一同使用,即 m^x,對於無符號 x 使用“全部位設定為 1”,對於有符號 x 時使用 m=-1。例如:

    ^2 = ^10 = -01 ^ 10 = -11
  • 位左移 <<

    • 用法:bitP << n
    • bitP 的位向左移動 n 位,右側空白部分使用 0 填充;如果 n 等於 2,則結果是 2 的相應倍數,即 2 的 n 次方。例如:

      1 << 10 // 等於 1 KB 1 << 20 // 等於 1 MB 1 << 30 // 等於 1 GB
  • 位右移 >>

    • 用法:bitP >> n
    • bitP 的位向右移動 n 位,左側空白部分使用 0 填充;如果 n 等於 2,則結果是當前值除以 2 的 n 次方。

當希望把結果賦值給第一個運算元時,可以簡寫為 a <<= 2 或者 b ^= a & 0xffffffff

位左移常見實現儲存單位的用例

使用位左移與 iota 計數配合可優雅地實現儲存單位的常量枚舉:

type ByteSize float64const (    _ = iota // 通過賦值給空白標識符來忽略值    KB ByteSize = 1<<(10*iota)    MB    GB    TB    PB    EB    ZB    YB)

在通訊中使用位左移表示標識的用例

type BitFlag intconst (    Active BitFlag = 1 << iota // 1 << 0 == 1    Send // 1 << 1 == 2    Receive // 1 << 2 == 4)flag := Active | Send // == 3

4.5.2.5 算術運算子

對於整數和浮點數,你可以使用一元運算子 ++(遞增)和 --(遞減),但只能用於尾碼,同時,帶有 ++ 和 -- 的只能作為語句

在運算時 溢出 不會產生錯誤

 

 

4.5.4 類型別名

 

當你在使用某個類型時,你可以給它起另一個名字,然後你就可以在你的代碼中使用新的名字(用於簡化名稱或解決名稱衝突)。

 

在 type TZ int 中,TZ 就是 int 類型的新名稱(用於表示程式中的時區),然後就可以使用 TZ 來操作 int 類型的資料。

 

Example 4.11 type.go

 

package mainimport “fmt”type TZ intfunc main() {    var a, b TZ = 3, 4    c := a + b    fmt.Printf(“c has the value: %d”, c) // 輸出:c has the value: 7}

 

實際上,類型別名得到的新類型並非和原類型完全相同,新類型不會擁有原類型所附帶的方法(第 10 章);TZ 可以自訂一個方法用來輸出更加人性化的時區資訊。

 

練習 4.5 定義一個 string 的類型別名 Rope,並聲明一個該類型的變數。

 

4.5.5 字元類型

嚴格來說,這並不是 Go 語言的一個類型,字元只是整數的特殊用例。byte 類型是 uint8 的別名,對於只佔用 1 個位元組的傳統 ASCII 編碼的字元來說,完全沒有問題。例如:var ch byte = 'A';字元使用單引號括起來。

在 ASCII 碼錶中,A 的值是 65,而使用 16 進位表示則為 41,所以下面的寫法是等效的:

var ch byte = 65 或 var ch byte = ‘\x41’

\x 總是緊跟著長度為 2 的 16 進位數)

另外一種可能的寫法是 \ 後面緊跟著長度為 3 的十進位數,例如:\377

不過 Go 同樣支援 Unicode(UTF-8),因此字元同樣稱為 Unicode 代碼點或者 runes,並在記憶體中使用 int 來表示。在文檔中,一般使用格式 U+hhhh 來表示,其中 h 表示一個 16 進位數。其實 rune 也是 Go 當中的一個類型,並且是 int32 的別名。

在書寫 Unicode 字元時,需要在 16 進位數之前加上首碼 \u 或者 \U

因為 Unicode 至少佔用 2 個位元組,所以我們使用 int16 或者 int 類型來表示。如果需要使用到 4 位元組,則會加上 \U 首碼;首碼 \u 則總是緊跟著長度為 4 的 16 進位數,首碼 \U 緊跟著長度為 8 的 16 進位數。

Example 4.12 char.go

var ch int = ‘\u0041’var ch2 int = ‘\u03B2’var ch3 int = ‘\U00101234’fmt.Printf(“%d - %d - %d\n”, ch, ch2, ch3) // integerfmt.Printf(“%c - %c - %c\n”, ch, ch2, ch3) // characterfmt.Printf(“%X - %X - %X\n”, ch, ch2, ch3) // UTF-8 bytesfmt.Printf(“%U - %U - %U”, ch, ch2, ch3) // UTF-8 code point

輸出:

65 - 946 - 1053236A - β - r41 - 3B2 - 101234U+0041 - U+03B2 - U+101234

格式化說明符 %c 用於表示字元;當和字元配合使用時,%v 或 %d 會輸出用於表示該字元的整數;%U 輸出格式為 U+hhhh 的字串(另一個樣本見第 5.4.4 節)。

包 unicode 包含了一些針對測試字元的非常有用的函數(其中 ch 代表字元):

判斷是否為字母:       unicode.IsLetter(ch)判斷是否為數字:       unicode.IsDigit(ch)判斷是否為空白符號:    unicode.IsSpace(ch)

這些函數返回一個布爾值。包 utf8 擁有更多與 rune 相關的函數。

 



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.