环境安装

Mac 下载go地址:https://golang.org/dl/

下载x86或arm架构的pkg包双击安装即可

GOROOT和GOPATH

GOROOT:go的安装路径

GOPATH:go的工作路径

GOPATH约定有三个子目录

  • src目录:存放源代码
  • pkg目录:编译时生成的中间文件
  • bin目录:编译后生成的可执行文件

go语言结构(以Hello,World!为例)

包声明 package main

引入包 import “fmt"

函数 func main\(\)

语句 fmt.Println\(“Hello,World\!"\)

注释 //go的简单实例

注意:a.标识符以大写字母开头时,可以被外部包代码使用,如果小写字母开头,则不可见

b.{不能单独放在一行

变量声明

声明单个变量:var a int 

a=1

不赋值时默认为0值

var a=1 

a := 1

注:如果已经用var声明过再使用:=声明会报错

声明多个变量:var a,b = 1,2

a,b := 1,2

空白标识符_ 用于抛弃值

常量声明

const a int = 1

const a =1

常量枚举 const{

a=1

b=2

c=3

}

iota特殊常量,在const中使用iota后iota的值为当前const枚举的常量的个数

条件语句

go中有select语句没有三元运算符,select语句是随机执行case语句内容,执行到可运行case停止

循环语句

go只有for循环

结构体

结构体作为函数参数时写法为func test\(book books\){}。

输出结构体的指针时使用fmt.Println()默认为%v输出,使用%p可以输出地址

切片

go的切片是因为go数组长度不可变,为了使用可变长度的数组,抽象出了切片

切片初始化 直接初始化:s := \[ \]int {1,2,3}

用数组初始化:s := arr \[:\]

使用make()函数初始化:s :=make\(\[ \]int,5,10\) 5是切片初始长度,10是最大长度

make()创建后赋值时需要一个值一个值进行赋值

range

range关键字用于for a,b := range “cd”

将cd字符串赋值给a,b变量,c字符的索引是第一个参数,字符的Unicode值是第二个参数

数组上使用range时,返回的第一个值为数组的索引,不需要可以使用_代替

map集合

无序的键值对集合

var a map\[string\]string		//声明map

a = make\(map\[string\]string\) //使用make函数

a\[“k”\] = “v” //为map插入键值对

或 a =: map\[string\]string{“k”:”v”}

接口

type phone interface{

    test\(\)

} //定义接口

type Iphone struct{

} //定义结构体

func\(iphone13 Iphone\) test\(\){

    fmt.Println\(5888\)

} //实现接口方法

使用时定义一个接口类型的变量iPhone phone,然后给变量赋值iPhone = new(Iphone)调用test()方法IPhone.test()

并发

go的并发通过go关键字开启goroutine 例 goroutine f\(x\) f\(y\) 

同一个程序中所有的goroutine共享一个地址空间

chanel

channel用来传递数据结构

ch \-\> v 把v发送到通道

v := ch 从ch接收数据

ch := make\(chan int\)创建一个通道

通道不带缓冲区,发送端发送数据时接收端要及时接受数据

可以设置缓冲区,创建通道时make的第二个参数是缓冲区的大小

缓冲区大小是有限的,当缓冲区满时,发送端将会不能发送数据

close()函数关闭通道

错误处理

go的错误处理是通过error接口

fmt.Println函数和println函数的区别在于,fmt.Println函数能输出全部类型,是标准输出,而println对有些类型的输出不支持

nil为空指针

格式化字符串 fmt.Sprintf()

在函数参数位置和返回值位置都可以直接赋值。例:func f\(a int\)\(b int\){}