Go:學習筆記兼吐槽(1) Go:學習筆記兼吐槽(1) Go:學習筆記兼吐槽(2) Go:學習筆記兼吐槽(3)

 

Go:學習筆記兼吐槽(2)html

Go:學習筆記兼吐槽(3)python

 


 

自動添加分號

在不少其餘的編程語言中,每一行代碼的結尾都必須有分號(假設一行中只有一句代碼),Golang 的開發者認爲,既然每行都要加,不如編譯器自動來加。固然,你加了分號也不會報錯。nginx

Golang 中,在如下兩種狀況下會自動加入分號:apache

  1. 當輸入被斷開爲標記時,若是行末標記爲編程

    • 一個標識符app

    • 一個整數、浮點數、虛數、字符或字符串文字編程語言

    • 關鍵字 break、continue、fallthrough、return 中的一個函數

    • 運算符和分隔符 ++、--、)、]、} 中的一個post

  2. 若是讓複合語句佔用單獨一行,則在 )} 後面的分號能夠被省略。學習

Golang 的這個特性,產生了不少寫法上的強制性規定。

(1)函數的左括號 { 必須和函數定義寫在同一行

這種寫法在其餘語言中是絕對沒有問題的,可是在 Golang 中會報找不到方法體,由於根據上面的規則,編譯器會在 func main() 後面自動加上分號。

(2)一條語句只能寫在一行中

若是你必定要把兩條語句寫在一行中,那麼也是能夠的,可是必需要在第一條語句後面手動加上分號。可是強烈不建議這麼作。

(3)用 + 拼接字符串時,若是要換行,+ 必須留在行末
var str string = "hello world " + 
    "hello world"

這是能夠的,但若是寫成如下形式就不能夠了,會報 invalid operation: + untyped string,由於編譯器會在第一行末尾添加分號。


其餘例子還有不少,這裏就不一一例舉了,當你用了一個在其餘語言中很是合理的寫法而 Golang 編譯報錯時,首先想一想看,若是每一句後面都加個分號,代碼仍是你預期中的樣子嗎。

回車和換行

\r 是回車符(return),做用是使光標移動到本行的開始位置;
\n 是換行符(newline),做用是使光標垂直向下移動一格;
因此咱們通常用 \r\n 來新起一行。

至於爲何回車和換行要分開,這是一個歷史遺留問題。而現今在不少語言中,\r\n\r\n 都能起到新起一行的做用。可是在 Golang 中,\r 依然只保留了其原始的回車做用。\n\r\n 都能起到換行的做用。

示例 1:
fmt.Println("hello\nworld!")

運行結果:

hello
world!
示例 2:
fmt.Println("hello\rworld!")

運行結果:

world!

這雖然有點坑,但其實還好,通常人換行符都會用 \r\n\n,不多有人會用 \r 吧。

定義的變量或導入的包若是沒有使用到,代碼編譯不能經過

這是強迫症患者的福音,例如我

變量的定義

(1)通常定義

通常語言中,定義變量時是類型在前,變量名在後:

int i = 10

在 Golang 中,是反過來的:

var i int = 10

包括函數傳參時亦是如此:

func test(str string){
    fmt.Println(str)
}
(2)類型推導

定義時若不聲明類型直接賦值,會根據值自行斷定變量類型

var i = 10    // i 就是 int 類型
(3)省略 var
name := "Tom"

注意::=,冒號不可省略,省略後就變成賦值了。而且變量名不能是已經聲明過的,由於這是聲明並賦值。
上面的語句等價於:

var name string
name = "Tom"
(4)一次性聲明多個變量
// 方法一
var n1, n2, n3 int

//方法二
var name, age = "Tom"20

//方法三:類型推導
name, age := "Tom"20
(5)聲明全局變量
//方法一
var name string = "Tom"
var age int = 20

//方法二
var (
    name = "Tom"
    age = 20
)

基本數據類型

(1) 整數

整數的類型有不少,int、int八、int1六、int3二、int64,還有 uint 系列。這裏要說明一下的是 int 這個類型,它在 32 位系統中佔 4 個字節,64 位系統中佔 8 個字節。定義變量時,整數的默認推導類型就是 int 型。

這裏有個吐槽點,我在下面的隱式轉換中再來吐槽。

(2) 浮點數

沒有 floatdouble,而是用 float32float64 表示。
浮點類型默認聲明爲 64 位。

var f = 3.14
fmt.Printf("%T", f)
// 輸出 float64

也能夠用科學計數法來表示( E 和 e 均可以)

var f = 3.14E2
(3) 字符類型(char)

Golang 中沒有專門的字符類型,若是要存儲單個的字符,通常用 byte 來保存。

字符串是一串固定長度的字符鏈接起來的字符序列。在其餘語言中,字符串是由字符組成的,而 Golang 的字符串不一樣,它是由字節組成的。(此處有坑,稍後詳解)

var c byte = 'a'
fmt.Println("C =", c)
// 輸出 97

當直接輸出字符的值時,實際輸出的是字符對應的碼值。若是須要輸出字符,則須要用格式化輸出。

fmt.Printf("c = %c", c)

Golang 中,中文也能夠是一個字符,這在其餘一些語言中是不能夠的。可是中文的碼值顯然超出了 byte 的範圍,能夠用 intrune 來定義。Golang 中統一使用 UTF-8 編碼。

var c rune = '中'
fmt.Printf("%v %c", c, c)
(4) 字符串

多行字符串,用 ` (ESC下面那個鍵)引發來

var str string = `hello
world`

字符串的默認值是 ""

隱式轉換

Golang 沒有隱式轉換,全部不一樣類型變量之間必須顯示轉換。類型轉換的基本語法相似 python。

var i int = 100
var f float32 = float32(i)

將一個大的數據類型轉換爲一個小的數據類型時(例如 int64 轉 int32),可能致使溢出,溢出不會報錯。

var num1 int64 = 999999
var num2 int8 = int8(num1)  // 轉換結果是63

吐槽開始,也許你以爲,隱式轉換沒有就沒有吧,最多用的時候強轉一下。看下面的代碼,你還會以爲如此嗎?



不一樣類型沒法比較。想說 fuck 嗎?
以前說道 int 類型的時候,有個要吐槽的,來看下面的代碼!
無論你是啥系統,int 和 int3二、int64 都是不一樣的類型,想直接比較?沒門!
相關文章
相關標籤/搜索