Why not Go ? Golang入門筆記1

各位狗(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)))
}

這裏有若干個要點……(我想到幾個講幾個吧)

  1. 在Golang中array的數據類型比較奇葩……比如我var ar [3]int{1,2,3},你猜ar類型是啥?不是什麼[]int,而是[3]int,所以在傳參時,如果要傳遞數組,首先得獲得數組長度……這多麻煩啊,所以就需要一個相對動態的類型來做中間介質了——slice勢力登場!在GetMD5函數中傳參傳的就是slice(雖然我覺得string傳參也沒毛病)至於slice的詳細特性,推薦一個大神的入門教程中對slice的介紹 Golang基礎(包括對array/slice/map的詳細介紹)
  2. Golang中獲取變量類型的方法需要另外導入"reflect"包,調用Typeof方法
  3. a:=[]byte{'x','y','z'}是聲明並定義一個[3]byte型變量,而a:=byte("xyz")則是定義了一個slice
  4. 聲明一個函數需要func關鍵字+args+returns,注意!Go支持函數多返回值!比如我聲明一個函數multiret,就可以寫成如下形式 func multiret(a int64,b float32)(int64,int64,[]byte){……}
  5. slice變量其實非常像python中的字符串,但是也有所不像,比圖說某個slice來自於某個array,那麼這個slice其實並沒有獨立於array,對slice的append方法就會改變所來源的array,以及slice的cap有限,受制於array的大小。
  6. ……
總而言之,Golang很有趣~
夜深了,就先講這些了,明天繼續補Golang筆記2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章