简介
什么是Go语言
Google出品计算机通用型计算机语言
-
高性能、高并发
-
语法简单
-
丰富标准库
-
完善工具链
-
静态链接
-
快速编译
-
跨平台
-
垃圾回收
Go语言用途
应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器,由于其提供的高并发,其非常适合于游戏服务端开发
基础语法
例子
package main //该文件属于程序入口文件main的一部分
import( //导入标准库中fmt包
"fmt"
)
func main( ) {
fmt.Println("hello world")
}
运行命令
go run example/main.go
1.变量
变量的声明:
var a=3
f :=float32(e)
Golang里面变量类型是后置的
在func main之外声明的变量为全局变量,func main内声明变量为局部变量,二者可同名,但函数内部的局部变量优先级高于全局变量。
2.if else
func main() {
if 7%2==0 { //无括号
fmt.Println("good")
}else {
fmt.Println("bad")
}
}
3.循环
只有for循环,可用break或者continue跳出循环
func main() {
i :=9
for j :=7; j<i; j++{ //也是和if一样,不需要括号
fmt.Println("loop")
break
}
}
4.switch
无需break跳出是最大特点,其次是多类型变量
func main() {
a :=2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
}
}
5.数组
func main() {
var a [5]int //定义数组,还可以var a=[5]int{1,2,3,4}
a[4]=100
fmt.Println(a[4],len(a))
}
与其他基础语法不同在于变量类型定义在变量名后,而不是前。
6.切片
非固定长度数组,可随时任意改变长度
func main() {
s :=make([]string, 3) //定义切片,也可以var s []string=make([]string, 3)
s[0]="a"
s[1]="b"
s[2]="c"
fmt.Println("get: ", s[2])
fmt.Println("len: ", len(s))
}
这也是一个比较长的东西,上面的例子只是简单的介绍。
7.map
哈希或者字典,一种数据结构
map 的容量是指 map 中可以保存的键值对的数量,当 map 中的键值对数量达到容量时,map 会自动扩容。如果不指定 initialCapacity,Go 语言会根据实际情况选择一个合适的值。
func main() {
m :=make(map[string]int) //key类型string和value类型int的一个空map, m :=make(map[string]int,10)是初始容量为10的map
m["one"]=1 //修改元素,下同
m["two"]=2
fmt.Println(m) //map[one: 1 two: 2]
fmt.Println(len(m))// 2
fmt.Println(m["one"]) // 1
fmt.Println(m["two")] // 0
}
8.range
一般用于快速遍历单个map或者单个slice(切片)
值得注意的是,range遍历时数组会返回索引值和对应位置值,如果不需要索引可以用下划线来忽略
func main() {
nums :=[ ]int{2, 3, 4} //定义数组
sum :=0
for i, num :=range nums {
sum +=num
if num==2{
fmt.Println("index: ", i, "num: ", num) //index: 0 num: 2
}
}
9.函数
简单举一个例子(因为各语言都差不多,只需要注意定义的顺序不一样)
func add(a int, b int) int {
return a+b
}
Golang函数可以返回多个值,在实际应用中,一般返回两个值,一个是真正的返回结果,一个是错误信息
10.指针、结构体
和c或者c++指针差不多,不再说了。
11.Go语言类型转换
类型转换用于将一种数据类型的变量转换为另外一种类型的变量。
数值型
var a int=10
var b float64=float64(a)
和python的转换很像。
字符串类型转换
var words string="10"
var num int
num,_=strconv.Atoi(words)
以上代码将字符串变量words 转换为整型变量 num。
注意,strconv.Atoi 函数返回两个值,第一个是转换后的整型值,第二个是可能发生的错误,我们可以使用空白标识符 _ 来忽略这个错误(在上面提到过的返回值忽略)
还有字符串整数互转、字符串浮点数互转、接口类型转换等。
12.Go错误处理
Go语言内置了错误接口 可以类比c++的错误处理
type error interface {
Error() string
}
其实类似自定义一个可以抛出错误的函数来作为错误接口。
13.Go并发
并发就是多运行线程
Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。 goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。
go func (x)
Go 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutine 来执行一个函数。 同一个程序中的所有 goroutine 共享同一个地址空间。
13.1.通道
通道(channel)是用来传递数据的一个数据结构。
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
ch :=make(chan int) //声明通道
ch <- v //把v发送到通道ch
v :=<-ch //从ch接受数据
-
默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。
(额外)SOCKS5代理
明文传输的代理协议,其作用在:让授权的用户可以通过单个端口去访问内部所有资源。
工作原理
-
浏览器与socks5代理建立TCP连接
-
代理与真正服务器建立TCP连接
-
握手阶段:浏览器向socks5代理发送请求
-
认证阶段:握手阶段发送的包中含有支持的认证的种类,socks5会选中返回给浏览器,接着进行认证流程。
-
请求阶段:认证通过后浏览器会对socks5服务器发起请求。代理服务器收到后会与真正服务器建立连接,然后返回一个响应。
-
回复阶段:浏览器正常发送请求,代理服务器收到之后讲请求转换到真正服务器上,真正浏览器的·响应也会通过代理服务器转换到浏览器。