20200323 Go语言基础
目录
课件
最后三周(0323)
5天go语言,docker,MongoDB,redis(高级用法),简历的制作
5天,就业辅导 (数据接口与算法)
数据库读写分离,mysql主从,redis主从,烧哨兵,数据库分表,分布式id生成,地理位置分析(微信附近的人)
Go语言
一. 介绍
1. 简介
go -- golong,2009 谷歌公司推出的编程语言
python 1989 龟叔
Java 1990 sun公司,被甲骨文公司收购
最新的语言,10多年的时间,简单易用,但可能会有以下小bug,有不完善的地方(库少)
2. 静态,强类型,编译型语言
区别于python
- 静态: 类型在程序运行中不允许改变
- 强类型: 不同类型之间不允许直接运算(10+'tt')
- 编译型: 先编译再执行 > > > 编译成可执行文件
- 解释型语言,代码要运行在解释器之上
-- c : 编译成 .dll(动态链接库),就是可执行文件
-- java: 解释型还是编译型?
有个编译过程,并不是编译成可执行文件,编译成 .cls文件,不能直接运行在操作系统上,他需要运行在jvm(java虚拟机上,就可以当做解释器)
-- 无论在什么平台执行java程序,最少要安装java虚拟机.一处编码,处处运行(跨平台)
3. 跨平台编译语言
在不同平台可以编译出另一个平台的可执行文件
- linux上安装软件,源码安装(make,make install),linux上安装python环境
c/c++ 写的代码不同平台的软件,需要先编译成可执行文件
python写的代码: 需要安装解释器(不同平台),python代码直接打包成exe文件(在exe内部,打包进去了解释器)
- 图形化开发: gui(第三方包Tkinter)/pyqt
java写的代码: 不同平台需要安装java虚拟机
go: 只要编译完了,直接拿着执行就可以了(不同平台编译不同平台的可执行文件)
- 要运行go写好的程序,直接拿着可执行文件,执行就可以了
python:
写接口 -- 新机器安装python,安装django,安装插件 -- 使用
go:
写代码 -- 编译成可执行 -- 新机器直接运行
java:
写完 -- 编译成jar或war包 -- 新机器安装jdk(版本) -- 执行
4. 垃圾回收机制
gc,c语言没有垃圾回收,变量定义了,不使用的话,需要自己释放掉
5. 面向对象,过程
支持面向对象和面向过程 (go不是一门纯粹的面向对象的语言,没有类的概念,但是可以实现面向对象的特性: 继承封装多态)
6. go版本
go也是由C写起来的(python也是c写的,django是有python写的)
go1.5以后,都是自己实现自己
7. 生态
- Google 在用: k8s(容器编排)用go写的
- docker(不是谷歌公司),用go写的
- 腾讯蓝鲸
- 手机百度 后端大量的go
- 区块链: 用go写(可以任意语言写,第一款开源的区块链项目:用go写的)
go特别适合服务端开发(高并发)
将会统治下一个10年
二. Go语言开发环境的搭建
搭建开发环境,如果只是要执行go编译后的文件,不需要安装任何软件
1. windows中安装
https://www.cnblogs.com/zhangguosheng1121/p/11448194.html
- go的下载安装(相当于python解释器):
https://golang.google.cn/doc/install?download=go1.14.1.windows-amd64.msi
版本 1.11 以上即可
一路下一步即可
- IDE的下载安装 (Goland,VS code,Vim Go,liteIDE)
- 建议使用Goland,跟pycharm是一家,jetbrains公司出的:注册码通用,操作习惯,99%跟pycharm一样
- vs code: 免费的,微软的,go插件,python插件(也可以开发python)
goland安装:
https://studygolang.com/dl
无脑下一步
验证安装
cmd窗口中:
go version # 显示出版本号
go env # go的环境
-GOPATH: 用户目录下的go文件夹中
-GOROOT: 解释器安装路径
简单配置
- GOPATH: 写的代码存放的路径,以后写的所有go的代码,必须放在GOPATH下,否则不能执行
有以下三个文件夹,如果没有需要创建出来
- src: 所有写的go相关的代码都存放在src文件夹中
- bin: 编译后的可执行文件位置
- pkg: 编译过程中出现的
- GOROOT: go解释器安装的路径
2. goland
- 创建项目:
必须在go/src的文件夹下
- 配置GOROOT:
默认下拉系统会找到,否则手动添加
index entire GOPATH
勾选此选项会自动创建出一个GOPATH,一般不用
- 新建文件
打开项目新建go.file即可
三. Go语言基础
package main // 必须指明是哪个包(main包)
import 'fmt' // 表示导入fmt包 >> 相当于导入包进行使用
func main(){ // 定义了一个main函数
fmt.Println('hello world') // 打印出hello world
}
- 写go代码,必须把代码放在
main
包下的main函数中(go程序的入口是main包下的main函数) fmt.Println('hello world')
你看到的a..
其实是goland给你提示的,函数的形参是a..
- go中导入包就必须使用,否则报错(''注释包,自动删除'':是goland做的优化,其他的无)
1. 注释
- 单行注释
//
- 多行注释
/*
多行注释
*/
2. 代码执行
1. goland执行
右键点击 Run 执行即可 (仅限于goland)
2. 先编译再执行 go build 文件.go
正统的用法 go build 文件.go
编译:编译成当前平台的可执行文件 .exe
go build 文件.go
执行:切换到路径下,直接执行文件
3. 编译并执行 go run 文件.go
相当于2中所有的步骤,但不产生可执行文件(s1.exe不产生)
3. 变量
- 变量定义必须使用,否则报错
- 查看变量类型
fmt.Printf()
- 变量要先定义再使用
- 变量类型是固定的,不能中途改变(静态语言)
- 如果只是定义变量,必须指定类型(只能用第一种定义方式)
- 不能重复定义变量
定义变量
1.全定义 var关键字 变量名 变量类型 = 变量值
var a int = 10
2.类型推导 (自动推导出变量类型)
var a = 10
3.简略声明(使用较多:=
)
a := 10 // 定义a并赋值10
4.只定义变量,不赋值
var a int // int类型的控制 是0
a = 100
代码
package main
func main() {
a :=10
fmt.Println(a)
}
声明多个变量
第一种:
var a,b,c int =10,11,12
第二种:
var a,b,c = 10,12,'xxx'
第三种:
a,b,c := 11,12,'aaa'
重复定义的特殊情况
var a int
// var a,b = 10,20 go语法不允许
a,b := 10,30 //go语法允许
4. 变量类型
package main
import "fmt"
//类型: 数字,字符串,布尔
/*
数字:
-int:整数类型(包括负数)
-int,int8,int16,int32,int64
-int8:表示能存储的长度 8个比特位,8个小格,一个格只能放0和1,
能表示的范围是:正的2的七次方-1到,负的2的7次方-1
-int16,32...类推
-int:在32位机器上,表示int32,在64位机器上表示int64
-表示人的年龄:300岁撑死了,int64 是不是有点浪费,可以定义成int8
-python中int类型,远远比go的int64大,大很多,python中一切皆对象,int int对象
-uint:正整数
-uint,uint8,uint16,uint32,uint64
-uint8:范围:正2的8次方减一,有个0
-float:小数
-float32,float64
-complex:复数(高等数学学得,实部和虚部,了解)
-complex32,complex64
-byte:uint8的别名,byte:翻译过来是字节,一个字节是多少,8个比特位,uint8就占8个比特位
-rune:int32的别名,4个字节,表示一个字符
字符串
string:用双引号表示的(单引号?表示的不是字符串,三引号?)
双引号和三引号
布尔:
bool:true,false(都是小写)
*/
数字
-int:整数类型
-int,int8,int16,int32,int64
-int8:表示能存储长度 8个比特位,
-uint:正整数
-float:小数类型
-complex:复数类型(高等数学学的,实部与虚部,了解)
-byte: uint8的别名
-rune: int32的别名
字符串 string
使用双引号
var a string = "my name is dab"
反引号:就是python中的三引号,可以换行
var a string=`这是第一行
第二行
结束`
go 中代码跟格式没关系
布尔 bool
var a bool=true
5. 常量const
恒定不变的量,只赋值一次,以后再也不能改了
const关键字 变量名 变量类型 =值
const name string="jack"
类型推导
const name ="jack"
同时定义多个常量
const name,age = "jack",16
简历
- 个人介绍:
姓名,性别,学校,专业,工作经验(至少先写两年)
- 个人技能:
django,python,redis,go
- 项目经验:
代码发布系统:干啥用的,功能,技能点,技术栈
- 自我评价:
在工作中,公司组织