从其他主流语言快速入门Go
0x00 Go语言最为显著的特点
- 无需像Python一样担忧部署环境,Go编译后相同CPU架构无缝运行。
- 由于是编译型语言,Go的性能有质的提升。但也因为是编译型语言,报错特征不明显。
- 内置关键字提供channel机制,这使得一句代码就能实现并发,属于天然优势。
0x01 Go安装
Downloads - The Go Programming Language
一般选择新版本即可,也就是16.x+,在低版本存在历史遗留问题vendor不建议入手。
安装完成后命令行 go version检查版本号。
0x02 Go HelloWorld
package main // package的概念与C++命名空间相似
// 对于程序的主入口要求package必须是main
// 如果想要分模块,可以另外新建文件夹命名不同的package
import ( // 导入模块关键字
"fmt"
"time"
)
func main() {
fmt.Println("Hello Go") // fmt.Println输出到普通流。
// print("Hello Go") // 内置print函数输出到错误流,所以一般不用
time.Sleep(1 * time.Second) // 睡1秒,time.Second单位既不是1也不是1000,感兴趣可以输出看看具体值
}
# 直接运行go文件
go run hello.go
# 将go文件编译为可执行文件
go build hello.go
0x03 Go常用类型与变量
package main
import (
"container/list"
"fmt"
"strconv"
)
func main() {
// 变量定义方式1
var var1 int = 3
// 变量定义方式2
var (
var2 int
var3 float32
)
// 变量赋值
var1 = 5
var2 = 3
var3 = 2.0
fmt.Println(var1)
fmt.Println(var2)
fmt.Println(var3)
// 变量转换
var2 = int(var3)
fmt.Println(strconv.Itoa(100)) // 整数转字符串
fmt.Println(strconv.Atoi("100")) // 字符串转整数
fmt.Println(string([]byte{97, 98, 99, 100})) // 字节转字符串
fmt.Println([]byte("abcd")) // 字符串转字节
// 变量赋值形式2 :=运算符仅能用于指针类型变量初始化使用
var5 := list.New()
var5.PushBack("var5")
fmt.Println(var5)
// var5 := list.New() 比如var5已经定义后再次定义是有错误的
// 变量赋值形式2等价写法,该写法能提前定义var6变量以便后续重复使用
var var6 *list.List
var6 = list.New()
var6.PushBack("var6")
fmt.Println(var6)
// 创建自定义类型
// 同变量赋值形式2,book实际上属于C++的指针类型
book := Book{
id: 1,
name: "Go Travel",
price: 32.5,
}
fmt.Println(book.toString())
// 创建特殊类型
maps := map[string]interface{}{
"key1": "122",
"aa3": 21,
}
fmt.Println(maps)
}
type Book struct {
id int
name string
price float32
}
// Go语言没有class关键字,对于类的概念只能先定义基础数据结构,随后使用如下的函数定义形式进行扩展
// 最终效果可以在Book指针变量book初始化后使用book.toString()调用该封装函数
func (book *Book) toString() string {
return fmt.Sprintf("book: id:%d, name:%s, price:%f", book.id, book.name, book.price)
}
0x03 函数与流程控制
// 首字母小写仅能在本文件中调用函数
func add(a int, b int) int {
return a + b;
}
// 首字母大写对外提供导出,另一个模块在import本模块之后就能调用Sub函数
func Sub(a int, b int) int {
return a - b;
}
// if else
var age int = 23
if age == 25 {
fmt.Println("true")
} else if age < 25 {
fmt.Println("too small")
} else {
fmt.Println("too big")
}
maps := map[string]interface{}{
"key1": "122",
"aa3": 21,
}
fmt.Println(maps)
// go语言版本的while
for false {
;
}
// 迭代集合的循环,对于List当然只有一个元素,此处maps是kv结构
for k, v := range maps {
fmt.Println(k, v)
}
// go语言版本的for i
for i := 0; i < 10; i++ {
fmt.Println(i)
}
0x04 使用第三方库
比如想使用这个库
https://github.com/levigross/grequests
在CMD命令行执行 go get -u github.com/levigross/grequests 即可安装到本地
C:\Users\admin\go\pkg\mod\github.com\levigross\grequests@v0.0.0-20190908174114-253788527a1a
这点形如python包安装在root\Lib\site-packages中想要复用一样
随后在需要的地方import "github.com/levigross/grequests"即可使用