安装的环境变量的作用
GOROOTGO安装目录GOPATHGO工作目录GOBIN=$GOPATH/binGO可执行文件目录PATH=$PATH:$GOBIN:$GOROOT/bin将GO可执行文件加入PATH中,使GO指令与我们编写的GO应用可以全局调用
go mod项目和GOPATH src的区别
- go mod项目可以放在任意位置,使用
go mod initgo mod tidy等命令 - src只能在
GOPATH目录下,然后用go getgo installgo run等命令 - src引入的三方包是基本是github上的,下载慢或者被墙可以直接去手动下载,然后将包放入src对应目录下
- go mod就可以用代理进行下载这些包, 依赖的第三方包被下载到了$GOPATH/pkg/mod路径下。
- src目录同级目录下有
pkg和lib目录一个是存放归档包的地方,一个是存放可执行文件的地方
go语言关键字
- var和const :变量和常量的声明
- var varName type 或者 varName : = value
- package and import: 导入
- func: 用于定义函数和方法
- return :用于从函数返回
- defer someCode :在函数退出之前执行
- go : 用于并行
- select 用于选择不同类型的通讯
- interface 用于定义接口
- struct 用于定义抽象数据类型
- break、case、continue、for、fallthrough、else、if、switch、goto、default 流程控制
- chan用于channel通讯
- type用于声明自定义类型
- map用于声明map类型数据
- slice用于声明切片也就是动态数组
- range用于读取slice、map、channel, string数据
var用法
var a, b *int
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)
i, j := 0, 1
const用法
const b string = "abc"
const b = "abc"
const (
e = 2.7182818
pi = 3.1415926
)
const (
Sunday Weekday = iota // 0
Monday // 1
)
package和import
package main
import (
"net/http"
)
func用法
func main() {
}
func() {
}()
f := func() {
}
func visit(f func()) {
}
type A int64
func (b *A) test(c int64, e string) (d int64, f string) {
return 0, "";
}
return用法
func test() (d int64, f string) {
return 0, "";
}
defer用法
- www.jianshu.com/p/79c029c0b… 先进后出,和return同时执行,函数内作用域,只能执行一条指令,多条可以用匿名函数
defer fmt.Println("1")
defer func(){
}()
go用法
go a();
go func(){}();
select用法
//select基本用法
select {
case <- chan1:
// 如果chan1成功读到数据,则进行该case处理语句
case chan2 <- 1:
// 如果成功向chan2写入数据,则进行该case处理语句
default:
// 如果上面都没有成功,则进入default处理流程
}
interface用法
type I interface {
Get() int
}
struct
type Person struct {
Name string
}
type Man struct {
Name string
Person
}
type Child struct {
Name string
person Person
}
chan
声明
// 声明不带缓冲的通道
ch1 := make(chan string)
// 声明带10个缓冲的通道
ch2 := make(chan string, 10)
// 声明只读通道
ch3 := make(<-chan string)
// 声明只写通道
ch4 := make(chan<- string)
发送
当写入的数据等于缓冲大小也会阻塞,不带缓冲的写入就阻塞
ch <- 0
接收
不带缓冲的通道,看用那种方式才会阻塞,而带缓冲的没数据就会阻塞
阻塞
data := <-ch
<-ch
非阻塞
data, ok := <-ch
for data := range ch {
}
关闭
- close 以后不能再写入,写入会出现 panic
- 重复 close 会出现 panic
- 只读的 chan 不能 close
- close 以后还可以读取数据
close(chan)
type
type Books struct {
}
type Phone interface {
}
//类型别名,只能对包内的类型产生作用,对包外的类型采用类型别名,在编译时将会提示如下信息
type name string
type handle func(str string) //使用 type 基于现有基础类型,结构体,函数类型创建用户自定义类型
map
m = make(map[string]int)
var m map[string]int = map[string]int{"hunter":12,"tony":10}
m = map[string]int{}
i := m["route"]
i, ok := m["route"]
delete(m,"route")
slice
var sli_1 [] int //nil 切片
var sli_2 = [] int {} //空切片
var sli_3 = [] int {1, 2, 3, 4, 5}
sli_4 := [] int {1, 2, 3, 4, 5}
var sli_5 [] int = make([] int, 5, 8)
sli_6 := make([] int, 5, 9)
sli[1]
sli[:]
sli[1:]
sli[0:3]
sli[0:3:4]
append(sli, 7)
sli[:len(sli)-2]
range
for _, num := range nums {
}
for index, num := range nums {
}
for k, v := range kvs {
}
for k := range kvs {
}
for index, c := range "go" {
}
for data := range ch {
}