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