Go语言学习基础 | 青训营

56 阅读5分钟

简介

什么是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服务器发起请求。代理服务器收到后会与真正服务器建立连接,然后返回一个响应。

  • 回复阶段:浏览器正常发送请求,代理服务器收到之后讲请求转换到真正服务器上,真正浏览器的·响应也会通过代理服务器转换到浏览器。