1 Go语言介绍
# 1 go -- golang,2009年 谷歌 公司推出的编程语言(python:1989年,龟叔 | Java:1990年,sun公司,现在被甲骨文收购了),很新的语言,10年多的时间,简单易用,性能高,可能会有小bug,有不太完善的地方,生态(库少)
# 2 静态 强类型 编译型语言 区别于python
-静态(动态python):(类型在程序运行过程中不允许改变)类型固定 a=10 a="qqq"
-强类型(弱类型:js):(go,python是强类型)强类型 ,不通类型之间不允许直接运算 10+"ttt"
-编译型(解释型:js,php,python):先编译再执行 编译成可执行文件--可执行文件执行
-解释型:
-解释型语言,代码要运行在解释器之上
-c 编译成dll(动态链接库),就是可执行文件
-java:解释型还是编译型?有个编译过程,并不是编译成可执行文件,.class文件,不能直接运行在操作系统之上,
它需要运行在jvm(java虚拟机之上,就可以当做解释器)
-不论在什么平台执行java程序,最少需要装java虚拟机, 一处编码,处处运行(跨平台)
# 3 跨平台编译 (可以跨平台编译:在不通平台可以编译出另一个平台的可执行文件)
-linux上安装软件,源码安装(make,make install),linux上安装python环境
c/c++写的代码不通平台的软件,需要现场编译成可执行文件
python写的代码:需要安装解释器(不通平台)----》python代码直接打包成exe --》pyinstaller,在exe内部,打包进去了解释器 ---》gui(Tkinter)/pyqt
java写的代码:不通平台需要装java虚拟机
go:只要编译完了,直接拿着执行就可以了(不通平台编译不通平台的可执行文件)
-要运行go写好的程序,直接拿着可执行文件,执行就可以了
# 4 有垃圾回收机制python,go,java (gc),c没有垃圾回收,变量定义了,不使用了,自己释放掉
# 5 支持面向对象和面向过程(go不是一门纯粹的面向对象语言,没有类的概念,但是可以实现面向对象的特性:继承封装多态)
# 6 go 1.5以后自己实现自己 --也是由 c写起来的(python:dict源码,django源码就是用python写的,java 都是c写的)
# 谁在用?
-google 在用: k8s(容器编排),都是go写的
-docker(不是谷歌公司的),用go写的
-腾讯蓝鲸
-手机百度 后端大量的go
-区块链:用go写(可以用任何语言写,第一款开源的区块链项目,用go写的)
# go特别适合服务端开发(高并发)
-将会统治下一个10年
2 Go语言开发环境搭建
# 搭建开发环境,如果要执行go语言编译后的文件,不需要装任何软件
# 1 https://golang.google.cn/dl/ 下载相应的包(1.11以上) ,相当于python解释器(可以做go开发了)
-python2.几 和 3.几
-一路下一步,完事(不需要改)
# 2 使用ide,Goland(pycharm几乎没有区别),VS Code ,Vim GO,LiteIDE
-建议大家用Goland,跟pycharm是一家,jetbrains公司出的,注册码通用,操作习惯,99%跟pycharm一样
-vs code:免费的,微软的,go插件,python插件(也可以开发python),你之前用pycharm,换成vs code,快捷键
-安装:无脑下一步
-以后建议你,不管做什么开发,都用jetbrains公司的就可以了
# 3 验证安装
-cmd窗口下:go version 显示出版本号,就装完了
-go env go的环境:
GOPATH:用户目录下的go文件夹中:GOPATH=C:Usersliuqingzhenggo
GOROOT:c:go
# 4 简单配置
-GOPATH:写的代码存放的路径,以后写的所有go的代码,必须放在GOPATH下,否则不能执行
-如果没有,需要创建出来
-src:以后你所有写的go代码,全放在这个文件夹下
-C:Usersliuqingzhenggosrc
-bin:编译后的可执行文件位置
-pkg:编译过程中出现的
-GOROOT:go解释器的安装路径
# 5 打开goland写代码
-创建项目,必须在GOPATH的src路径下:/Users/liuqingzheng/go/src/s12_day01
-配置GOROOT:默认下来就会找到,如果找不到,手动添加进来
# 6 因为所有代码必须放在GOPATH下,打上对勾,goland会自动创建出一个GOPATH,一般不用,就把项目放在之前的GOPATH下即可
# 7 在项目上点击右键,新建go file ,写上名字
3 第一个helloworld
3.1 go中的注释
//go当中的注释(跟js一样,java)
// goland快捷键:ctrl+/ 快速单行注释,解开注释
//单行注释
/*
多行注释
多行注释
*/
3.2 第一个hellowrold
package main // 必须指明是哪个包 main包
//表示导入fmt包,对比python即可
import "fmt"
func main() { //定义了一个main函数
fmt.Println("hello world") //打印出helloworld
}
//1 以后再写go 代码,必须把代码放在 main包下的main函数中(go程序的入口,是main包下的main函数)
//2 fmt.Println("hello world") 你看到的a... 其实是goland给你提示的,函数的形参是a...
//3 go语言中,包导入必须使用,否则报错,注释掉,包自动删除(goland做的,其他编辑器,没有)
3.3 go代码的执行
//执行go代码
1 goland上点击右键 Run 就可以执行(仅限于goland,vs code其他编辑器,都没有)
2 先编译,再执行正统的用法(go是编译型语言),用命令
编译:go build s1.go 编译,编译成当前平台的可执行文件 s1.exe
执行:s1.exe
3 编译并执行(在vs code上的命令窗口下执行go文件)
go run s1.go 相当于2中的所有步骤,不产生可执行文件 s1.exe不产生
4 变量
package main
//import "fmt"
// 变量
func main() {
//变量定义:定义方式三种,其他的都是变形
//1 第一种:全定义
//var关键字 变量名 变量类型 = 变量值
//var a int =10
//fmt.Println(a)
//2 第二种:类型推导(自动推导出变量类型)
//var a =10
//fmt.Println(a)
//fmt.Printf("%T",a) //查看a的类型
//3 第三种:简略声明(这个用的多) 冒号跟等号是一起的
//a := 10
//fmt.Println(a)
//4 只定义变量,不赋值
//var a int //int类型空值,是0
//var a
//a :=
//a=100
////a="100" //把字符串100赋值给a,不支持,静态语言
//fmt.Println(a)
//5 声明多个变量,三种方式都可以
//var a,b,c int=10,11,12
//var a,b,c=10,11,12
//var a,b,c=10,11,"xxx"
//a,b,c:=11,12,"ddddf"
//fmt.Println(a)
//fmt.Println(b)
//fmt.Println(c)
//fmt.Printf("%T",c)
//6 变量不能重复定义
//var a int
////var a=90 //重复定义
//a :=90 //重复定义
//a=90
//特殊情况
//var a int
//var a,b=10,20 // 不允许
////a,b:=10,30 //我觉得a是重复定义,go语法允许
//fmt.Println(a)
//fmt.Println(b)
}
/*
总结:
1 变量定义了必须使用,否则报错(只有go要求这样)
2 查看变量没写
3 变量要先定义再使用
4 变量类型是固定的,不允许中途改变(静态语言)
5 如果只是定义变量,必须指定类型,只能用第一种定义方式
6 变量不允许重复定义
强调:
以后所有类型的变量定义,就参照变量定义的三种方式
*/
5 变量类型
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(都是小写)
*/
func main() {
//1 int uint
//var a int8=100000
//var a int64=100000
//var a uint=-8 //错误
//var a uint=8
//fmt.Println(a)
//float:小数
//var b int =2.345 报错
//fmt.Println(b)
//var a float32=2.345
//fmt.Println(a)
//字符串
//var a string="my name is li"
//var a string=''dsfads'' go中根本没有三引号
//反引号,就是python中的三引号,可以换行
// var a string = `我很帅
// 你也很帅
// 它也很帅
//`
//var a string="你好
" +
// "我好" +
// "大家好"
// fmt.Println(a)
//var a int = 10
//fmt.Println(a)
//a = 13
//fmt.Println(a)
//布尔类型
//var a bool=true
//var a =false
a:=false
//a=0 //类型不匹配
fmt.Println(a)
}
//go代码跟格式缩进没关系,你的代码需要格式化,好看
6 常量
package main
import "fmt"
//常量:恒定不变的量,只赋值一次,以后再也不能改了,数据库连接地址,端口号
//const关键字 变量名 变量类型 =值
//const name string= "li"
//类型推导
//const name = "li"
//简略声明 不可以
//同时定义多个常量
const name,age ="li",19
func main() {
//name="zhang" //不允许修改
fmt.Println(name)
}