這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
- Go語言
- 特性
- Chapter1
- Chatper2 基本文法
- 特殊保留關鍵字
- tips
- 變數申請
- built-in types
- 流程式控制制
- if
- for
- break goto 都可支援標籤
- switch
- fallthrough
- func函數定義
- defer 延遲
- panic recover try catch
- import操作
- struct 自訂類型
Go語言
特性:
極簡文法,原生多線程支援;
讚美之詞:
解釋性的靈活,動態類型語言的效率,靜態類型的安全性;
Chapter1:
GOPATH 為 go語言的工作目錄;
* 基本檔案——$GOPATH/src, pkg, bin
* go build :編譯,若有main package 組建目錄名相同的可執行檔
* go install 產生package
* go fmt 可自動格式化代碼風格;
tips:
- array_linux.go array_darwin.go build 換選與當前系統內容相同的編譯;
Chatper2 ——基本文法
go 預設utf-8編碼;
特殊保留關鍵字:
chan, defer, fallthrough, map, range, select,
tips:
- fmt.Printf 不會自動換行;
- 而python的 print 會自動換行;
- _, b = 34, 35 ; # 賦值給 “_” 的變數會被丟棄
- 未使用的變數,會編譯錯誤(好強制);
- int32 與 int 64 不可加減(無cast);
- 支援複數: var c complex64 = 5 + 5i;
- 字串反引號 “ 括起來 為 raw_string, 不進行轉義;
- iota 每次賦值時,重設為0;
- 數組定長;
- slice 有個 cap 概念;當cap為0後,slice.append() 會開闢新的記憶體;
變數申請
var var1 typevar default_var1, default_var2 type = '1', '2'var notype_var1, notype_var2 = '1', '2'simple_var1, simple_var2 := '1', '2'
var variable type; 變數申明在最後;
提供預設值的時候可以不申明 type;
甚至不提供關鍵詞 var
var1, var2 := ‘1’, ‘2’
“:=” 賦值符號,相當於定義了這個變數;但僅針對局部變數;
全域變數必須用 var 顯式申明;
var 變數;
const 常量;
built-in types:
- bool: true, false
- int, uint; 以及各種定長 int32, int64; (各種int之間不可加減)
- string: 雙引號”“, 反引號“ 括起來;(無單引號) immutable;
改變字串,必須變為 byte 數組,修改後,再 new_str = string(btye_array)
- error: 錯誤類型
- array: var arr [n]type;
- slice: 動態數組; var arr []type;
- map: 即 python dict; rating := map[string]float32 {“C”: 4.5, “GO”: 5}
go語言的記憶體配置——每個資料類型 一塊 獨立的地區;(因此不同Int之間無法賦值)
iota 枚舉值
const ( x = iota y = iota z = iota w) # x:0, y:1, z:2, w:3const t = iota # 此時iota重設為0, t:0
convention:
大寫字母開頭的為 Public; 如 Sqrt
小寫字母開頭的為 Private; 如 calculate
流程式控制制:
if:
條件式左右 無 括弧 ()
條件是可 申明變數(局部變數,僅if語句塊內生效)
for
for i=0; i < 1000; i++ {}for ; sum < 1000; { sum += 10}可簡寫為:for sum < 1000; { sum += 10}# 其實就是 while(囧)
break, goto 都可支援標籤;
switch
每個 case 預設添加 break操作(終於不用寫那麼多 break 了)
fallthrough
強制 switch case 匹配後 繼續執行,不自動break;
func函數定義
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) { return value1, value2}
感想:囧!為啥把傳回值放到 參數後面去了;
給傳回值命名,最大的好處是 func 內可見,可直接return;
defer (延遲)
在函數結束後,逆序執行;(先進後出)
常用於資源關閉;
panic + recover = try catch;
每個 package 建議有一個 init 函數(正如python package 中的 init.py 作用一樣)
main 函數僅在 main package裡有;
import操作:
import ( f "fmt" . "net/http" _ "github.com/ziutek/mymysql/godrv")# f 此時為 fmt 的別名; . 為目前的目錄的意思,http包裡函數可以直接使用;# 同python 中 from net.http import *# _ 不引入變數,僅執行 init 函數;
struct 自訂類型;
type Human struct { name string age int weight int}type Student struct { Human speciality string}
匿名定義就相當於其他語言的繼承; Student預設包含Human的所有欄位;
# method 只需要在函數前面增加一個 receiver 即可;func (c Circle) area() float64 { return c.radius * c.radius * math.Pi}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。