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

- 项目经验:
	代码发布系统:干啥用的,功能,技能点,技术栈
	
- 自我评价:
	在工作中,公司组织
原文地址:https://www.cnblogs.com/fwzzz/p/12734328.html