各位狗(Go)年大吉~
這是我的Golang入門筆記開篇之作(PS:重點是筆記,用來記錄一些細節上的注意點而非入門教程)
接下來就開始我的表演~
0x00 我看Golang
第一次聽說Golang,還是在學Python爬蟲的時候,看到也有人用Golang寫爬蟲,但苦於只會一點Python和C,並不能完全看懂Go語言。如今來正式學習Golang,心情難免激動。看了一些Go語言的示例代碼和語言特性,竟然有種似曾相識的感覺——彷彿有着C/Java/Python的影子。去某乎上逛了圈發現確實還有人這麼評價Golang,"互聯網時代的C語言"。
好了不扯了,先做筆記。
0x01 Helloworld
先看我寫的第一段Go代碼
// test1.go
package main
import (
"fmt"
)
func main() {
var year int
fmt.Println("When?")
fmt.Scanln(&year)
if year == 2018 {
fmt.Println(year, ",Hello World!")
}
}
不難發現,Golang代碼基本上由三塊組成,package&import&func,這裏就非常像Java了,也可見Golang是典型的模塊化語言。其次,不知道有沒有人注意到,我所用到的輸入輸出函數開頭首字母都是大寫的。原因如下
大寫字母開頭的變量是可導出的,也就是其它包可以讀取的,是公有變量;小寫字母開頭的就是不可導出的,是私有變量。
大寫字母開頭的函數也是一樣,相當於class中的帶public關鍵詞的公有函數;小寫字母開頭的就是有private關鍵詞的私有函數。
越看越像Java了233333。有沒有人注意到那個取地址符&,關鍵的來了!Golang有指針!但是沒有指針運算……C和Java的合體進化體出現了23333。
0x02 MD5
還是先看代碼~
// test2.go
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"strings"
// "reflect"
)
func GetMD5(x []byte) []byte {
h := md5.New()
h.Write(x)
CipherStr := h.Sum(nil)
return CipherStr
}
func main() {
//can not use 'a:=[]byte{"Golang"}' due to data type conversion
var plain string
fmt.Scanln(&plain)
//change string into slice
a := []byte(plain)
b := GetMD5(a)
c := strings.ToUpper(hex.EncodeToString(b))
fmt.Printf("%s\n%s\n", c, c[8:24])
//fmt.Printf("Type_of_a:%s;\nType_of_b:%s;\nType_of_HexEncodeToString(b):%s;\n", reflect.TypeOf(a), reflect.TypeOf(b), reflect.TypeOf(hex.EncodeToString(b)))
}
這裏有若干個要點……(我想到幾個講幾個吧)
- 在Golang中array的數據類型比較奇葩……比如我var ar [3]int{1,2,3},你猜ar類型是啥?不是什麼[]int,而是[3]int,所以在傳參時,如果要傳遞數組,首先得獲得數組長度……這多麻煩啊,所以就需要一個相對動態的類型來做中間介質了——slice勢力登場!在GetMD5函數中傳參傳的就是slice(雖然我覺得string傳參也沒毛病)至於slice的詳細特性,推薦一個大神的入門教程中對slice的介紹 Golang基礎(包括對array/slice/map的詳細介紹)
- Golang中獲取變量類型的方法需要另外導入"reflect"包,調用Typeof方法
- a:=[]byte{'x','y','z'}是聲明並定義一個[3]byte型變量,而a:=byte("xyz")則是定義了一個slice
- 聲明一個函數需要func關鍵字+args+returns,注意!Go支持函數多返回值!比如我聲明一個函數multiret,就可以寫成如下形式 func multiret(a int64,b float32)(int64,int64,[]byte){……}
- slice變量其實非常像python中的字符串,但是也有所不像,比圖說某個slice來自於某個array,那麼這個slice其實並沒有獨立於array,對slice的append方法就會改變所來源的array,以及slice的cap有限,受制於array的大小。
- ……
總而言之,Golang很有趣~
夜深了,就先講這些了,明天繼續補Golang筆記2