之前想选一个好用点的ide写go,一开始在网上看到IDEA有go的插件,翻了老半天没找到,还以为是要装企业版,后来看了github的源码才发现早没更新了,无奈用vscode,结果插件装上后相关tools又下不下来(貌似与谷歌服务器有关,报错dial tcp 216.58.200.241:443: connectex: A connection attempt failed),后来添加了国内的镜像,好了。
go env -w GOPROXY=https://goproxy.cn
注意,首先需要正确安装go本体,然后再在命令行输入。
以下为语法内容:
切片Slice
go的数组大小是不能变化的,所以引入切片,切片可以理解为就是动态数组。创建一个切片可以通过多种方法:
great := []int{1, 2, 3, 4, 5}
great := make([]int, 3, 10) //第三个参数选填,为slice的容量cap
切片可以通过函数append()增加元素,使用copy()拷贝一段切片。但是,go
中并没有定义如何删除元素,所以我们只能利用这个数据类型本身的特性来删除元素,比如如果要删除开头元素或末尾元素:
a = a[1:] // 删除开头元素
a = a[:len(a)-1] //删除末尾元素
集合Map
集合通过键key对应数据来快速检索到数据,go的集合类似于python的字典dict,不过map只能存取相同的数据类型,所有的键值也必须为相同的数据类型。
初始化方法:
var good map[string]string
good = make(map[string]string)
插入内容:
good["我"] = "贼热爱学go"
println(good["我"])
//out :贼热爱学go
删除内容:
import (
"fmt"
)
func main() {
var good map[string]string
good = make(map[string]string)
good["我"] = "贼热爱学go"
good["它"] = "是孤寡青蛙"
delete(good, "它")
fmt.Println(good)
}
//输出:
//map[我:贼热爱学go]
并发
众所周知,高并发是大家非常热衷的词语,go通过协程的方式实现并发,相比于多线程,协程的好处是不用进行cpu的上下文切换,相对来说节省了时间。
方便的使用协程是go的最重要特性之一,在go中,使用关键词go就能开启一个协程,但是,由于我们不好控制协程间的运行速度,如果不加以限制,很容易出现主线程跑完了,但是协程还没开始跑的情况,所以可以引入sync包的WaitGroup,用Add()、Done()和Wait()函数让协程间具有等待的功能(也可以直接在main尾加入 time.Sleep(),但这既不优雅也不稳定!)
package main
import (
"strconv"
"sync"
)
var wg = sync.WaitGroup{}
func main() {
wg.Add(5)
a := 5
for i := 1; i <= a; i++ {
go wuho(i)
}
wg.Wait()
}
func wuho(a int) {
println(strconv.Itoa(a) + "号位置起飞飞!")
wg.Done()
}
为了让协程间能够相互传递数据,可以通过通道channel将不同协程的数据带回主线程
使用make初始化通道:
ch := make(chan int)
通道具有方向,默认是双向的,可以通过"<-"设置channel的方向:
chan T // 可以接收和发送类型为 T 的数据
chan<- float64 // 只可以用来发送 float64 类型的数据
<-chan int // 只可以用来接收 int 类型的数据