这是我参与「第三届青训营 -后端场」笔记创作活动的的第二篇笔记
什么是Go语言?
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。—— 《百度百科》
-
高性能、高并发
在Golang中不需要找第三方库就可以开发高性能高并发的程序!
-
语法简单、学习曲线平缓
Go语言类似C语言,但是Go语言进行了简化!eg:循环只有for循环一种表示方法……
上手很简单,学习曲线平缓
-
丰富的标准库
Go和python一样有很多丰富的标准库,并且稳定。
-
完善的工具链
Go官方内置了很多工具链使我们的开发更加简单
-
静态链接
在Go中所有的代码都是静态链接的只需要拷贝一个编译之后的文件即可运行,例如Java需要一个jre才能运行
-
快速编译
Go的编译速度极其快
-
跨平台
Go能在很多很多平台运行,不仅限于电脑,例如路由器。。。
-
垃圾回收
和Java类似,都有自己的垃圾回收系统,你不用担心内存管理只需要关心业务逻辑
基础语法
关于:=和=的区别
刚刚接触Go语言我很不理解为什么有时候使用=有时候使用:=原来这都是有讲究的
:=的意思是自动推导变量的类型并且自动帮我们声明,而=需要我们提前声明好变量类型,不能错误赋值
例如,下面
package main
import (
"fmt"
)
func main() {
var a string//声明了一个变量a
a = "hello,yalei"//这里给变量a赋值
fmt.Println(a)
}
如果这里错误赋值了,就会报错
下面是上面代码的运行结果
package main
import (
"fmt"
)
func main() {
// var a string
a := "hello,yalei"//这里把=替换为:=结果仍然还是上面这个
fmt.Println(a)
}
同样的var关键字也可以自动帮我们判断变量的类型
package main
import (
"fmt"
)
func main() {
var a ="hello,yalei"//这里结果仍然不变
fmt.Println(a)
}
switch
关于switch语句我们可以类似于其他编程语言,使用
switch(变量){
case ???: 逻辑内容;break;
default:逻辑内容;
}
在go中这样也是行得通的
不过不同的是在go中switch内置了break,不需要我们编写break语句,他在成功匹配的时候自动跳出switch代码块
go的switch还有一种用法
switch{
case false :逻辑
case true :逻辑
case false :逻辑
default :逻辑
}
这样的switch用法你一定没有见过,同样的我也没有见过,这样的switch语句相当于swtich true{……}然后通过判断里面的语句或变量是否为true来执行逻辑,在go中swtich还有一个特殊的关键字fallthough这个关键字可以放在逻辑中,这个关键字的作用是强制执行下一条case逻辑,对你没有听错就是强制执行下一条case逻辑(这里是强制执行,指的是不对条件进行判断)
select
select是go中独有的类似于switch语句,主要用于处理异步通道。select语句会选择一组可以发送或接受操作中的一个分支继续执行。
select没有条件表达式,一直在等待case进入可以运行的状态
- 如果select有多个分支都可以运行,select会伪随机公平地选择一个执行,其他分支不会执行
- 如果没有可运行的分支,且有default语句,那么就会执行default的动作
- 如果没有可运行的分支,且没有default语句,那么select就会阻塞,直到某个分支可以运行
for
在go中只有一个循环那就是for循环,不过for却有两种形式这里我们可以类比成Java中的for和while循环
for i := 0; i < 5; i++ {
fmt.Println(i)
}
//0=>1=>2=>3=>4=>
在go中如果你看到了一个for{}不要惊讶,这就是while true{}循环 当然你也可以在这个for后面添加类似于while 循环的判断语句来判断是否进入循环
i := 5
for i > 0 {
fmt.Print(i)
i--
}
//54321
for-range
在这个for-range中我想到了Java中的foreach循环用来遍历数组、列表、等
果然,和我想得一样,这个for-range循环就是这么用的
而他有两个值一个是k(索引)一个是v(值)
如果不想用这两个中的某一个直接使用 _ (下划线) 替换即可
arr := []int{1, 2, 2, 3}
for k, v := range arr {
fmt.Println(k,v)
}
if
关于if语句,我们同样可以看成Java中的if语句不过这里的if语句没有括号,并且这里的if语句同样支持局部变量的初始化
if x := 5; x < 10 {
fmt.Print("进入x<10逻辑")
} else {
fmt.Print("进入x>=10逻辑")
}
break和continue
go中的break和continue与Java中的并没有太大的区别,都是跳出循环和执行下一次循环的意思
这里就不再赘述
Go项目开发与编译
项目结构
GOPATH一般有三个子目录,分别是src、pkg、bin
- src存放源代码
- pkg存放编译后生成的文件
- bin存放编译后生成的可执行文件
Go程序的编译
- go run :只能作用与main包文件(先运行compile命令编译生成 .a 文件,然后链接命令生成最终可执行文件并运行程序,此过程生成的只是可执行文件,在go run 退出前会删除这些临时文件)
- goinstall:用于编译并安装指定的代码包及他们的依赖包,并且将编译后生成的可执行文件放到bin目录下,编译后的包文件放到pkg目录下
- go build 用于编译指定的代码包以及它们的依赖包。如果用来编译非main包的源码,则只做检查性的编译,而不会输出任何结果文件。
复合数据类型
数组(array)
//这是在Java中我们的写法 int[] a = new int[5];
var a = new([5]int) //[0,0,0,0,0]
var b = [5]int{} //[0,0,0,0,0]
var c = [...]int{1, 2, 3, 4, 5} //[1,2,3,4,5]
var d = [...]int{2: 100, 4: 50} //[0,0,100,0,50]
这里需要注意,a数组创建的是一个数组指针,例如我写了这样一行代码e := a,之后我修改了a数组中的值例如a[1] = 100,此时e[1]也变成 了100
需要注意的是,我们在写函数的时候,如果将一个数组传递给函数,如果数组长度并不是很大还好,如果很大的话,建议使用数组指针的形式,因为这样可以省去很多内存
同样的Go也支持多维数组,这里就不再赘述多维数组的声明
\