golang(入门)

315 阅读3分钟

安装的环境变量的作用

  1. GOROOT GO安装目录
  2. GOPATH GO工作目录
  3. GOBIN= $GOPATH/bin GO可执行文件目录
  4. PATH = $PATH:$GOBIN:$GOROOT/bin 将GO可执行文件加入PATH中,使GO指令与我们编写的GO应用可以全局调用

go mod项目和GOPATH src的区别

  1. go mod项目可以放在任意位置,使用go mod init go mod tidy 等命令
  2. src只能在GOPATH目录下,然后用go get go install go run等命令
  3. src引入的三方包是基本是github上的,下载慢或者被墙可以直接去手动下载,然后将包放入src对应目录下
  4. go mod就可以用代理进行下载这些包, 依赖的第三方包被下载到了$GOPATH/pkg/mod路径下。
  5. src目录同级目录下有pkglib目录一个是存放归档包的地方,一个是存放可执行文件的地方

go语言关键字

  1. var和const :变量和常量的声明
  2. var varName type 或者 varName : = value
  3. package and import: 导入
  4. func: 用于定义函数和方法
  5. return :用于从函数返回
  6. defer someCode :在函数退出之前执行
  7. go : 用于并行
  8. select 用于选择不同类型的通讯
  9. interface 用于定义接口
  10. struct 用于定义抽象数据类型
  11. break、case、continue、for、fallthrough、else、if、switch、goto、default 流程控制
  12. chan用于channel通讯
  13. type用于声明自定义类型
  14. map用于声明map类型数据
  15. slice用于声明切片也就是动态数组
  16. 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用法

  1. 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 {
}