go语言 介绍, go语言环境搭建, 创建项目(helloworld示例), 变量的定义和使用, 常量, 基本数据类型, 跨平台编译成linux下可执行文件
# sanic:交友类,号称用户1个亿 ,fastapi 异步框架 # django,flask 同步框架(django 3.0以后支持异步,但是不好) # gevent,asyncio:作者牵头,异步模块 # 猴子补丁 #import json from xxx import yyy as json # 每个py文件都要 # 写一句话,可以把全局的json都替换成你的json(在解释器内替换) json.dumps() json.loads()
# 1 诞生于 2009年,10年的时间,非常新的语言,天然支持并发,很新,生态不完善 -python:1989年 -java:1990年 -2005年,之前的语言,对并发支持不是特别好 # 2 轮子少(生态),django,flask beego(中国人写的,orm都有),gin(集成gorm),两三个连mysql的模块 # 3 google出的 python,java:sun公司,甲骨文收购了 c#:微软 #4 Go是静态 强类型语言,是区别于解析型语言的编译型语言。 -编译后执行---》编译成可执行文件 (java编译成字节码--运行在jvm上,每台机器都要跑一个jvm,300m内存) -解释型:直接运行在解释器上,php,js,python -夸平台性如何?java:一处编码,处处运行,go:夸平台编译(交叉编译),可以在windows平台编译出linux下的可执行文件 -在linux上装过python,源码包下载,解压,make && make install gcc编译的,当前平台的可以执行文件 -go写的程序,只需要跨平台编译完,拿到不通平台上,不需要安装任何依赖 -强类型:go,python是强类型,不允许不同类型运算 'aa'+1 报错 -弱类型:允许不通类型运算 # 5 跨平台的编译型语言 # 6 有垃圾回收的机制(gc) 类似python,但python还因为gc搞出gil锁 # 7 支持面向对象和面向过程的编程模式(go不是一个纯粹的面向对象语言,面向对象的特性它都有:继承,封装,多态) # 8 2009年推出 12年稳点版本 1.5——实现的架构变化,同时保留了和旧版本的兼容性,以后的go,完全实现了go自己写的 2020年 1.14版本 ---》规划:go 2.0以后,会有大更新:支持泛型,异常处理。。。 # 9 Go语言应用:google,基本上所有互联网都会有go,不是在用go,就是在转go的路上 # 10 go语言为什么笔记火:docker火,谷歌(k8s),区块链(第一款开源的区块链项目,用go写的),国内互联网公司爱用,性能高,语法简洁,上手快,go特别适合服务端开发(微服务的开发) # Go语言发展前景:统治下一个十年
# go开发包(类似于python解释器)+ ide(golang,vscode,sublime text。。。。) 下载路径:https://golang.google.cn/dl/ # golang:跟pycharm 90%相似,jetbrains公司,idea,用来开发java的,phpstorm,pycharm,goland 下载路径:https://www.jetbrains.com/go/download/#section=windows # go version 查看go的版本 # go env 查看go的环境变量 GO111MODULE= # 没有值或者off,表示没有开启go mode模式,用的就是gopath模式(此时如果代码放在GOPATH以外的路径则无法执行,找东西会找不到) GOROOT=c:\go # go开发包的安装路径,确认好是否对 GOPATH=C:\Users\Administrator\go # 代码存放路径,确认好是否对,以后你的go代码都放在这个文件夹下 # GOPATH可以在环境变量中进行更改 # 在任意位置敲go,都有这个命令,需要把 c:\go\bin加入环境变量 # go mode模式:代码可以放在任意路径
3 创建项目
# 1 不管是用goland还是其他ide,新建项目的路径(代码),必须放在gopath路径下的src文件夹(如果没有手动创建出来) # 2 gopath路径下会有三个文件夹:src(放代码的),pkg(编译过程产生中间的东西),bin(编译后的可执行文件) # 3 创建项目,在项目下,创建go文件,起一个名字 # 4 执行代码(编译型语言,先编译再执行) 编译:go build xx.go -->编译成当前平台下的可执行文件,名字为xx 执行:./xx windows:在可执行文件路径下 xx.exe # 5 go命令 -go build 编译 在当前目录留下可执行文件 -go install 安装,把编译好的可执行文件,放到bin路径下 -go fmt :代码格式化 -go run xx.go 编译并执行 不会在当前目录留下可执行文件 # 6 在golang中执行 右键,选择,run
// go语言中的单行注释使用 /* 多行注释 多行注释 */ //ctrl+/ 可以快速注释,解注释(goland) package main //表示声明main包,每一个go代码的第一行必须写这个 import "fmt" //导入fmt包 类比python中import os os.path func main() { //声明main函数 函数体的内容,放到大括号中 //goland提示的a... 形参是a fmt.Println("hello world") //在控制台输出helloworld ---> print("hello world") fmt.Println("hello world") } // 程序的执行入口,是main包下的main函数 // 编译型语言,都有入口 ----》 对比python中一个py文件就是一个main函数 //一个go项目只能有一个main函数
/* ########### 变量的定义和使用 ########## */ package main func main() { //1 方式一:基本定义 //var关键字 变量名 变量类型 =变量值 //var age int=18 //定义并赋值 //var age int //定义 //age=18 //赋值 //2 方式二:类型推导(不需要加类型了,并不代表没有类型,类型都是固定的) //var age =18 //var age //错误,变量定义时,就要固定类型 //age=18 //3 方式三:简略声明(冒号跟等号是一起的,推荐第三种) // age :=18 //age //更不对了 //age=18 //4 同时定义多个变量 //var age,a,b,c int=18,19,20,21 //var age,a,b,c =18,19,20,21 //age,a,b,c :=18,19,20,21 //变形(能看懂,表示在定义即可) //var ( // age=19 // name="lqz" // sex="男" //) //5 变量要先定义再使用 //a=19 //a:=10 //6 变量不能重复定义 //var a int=18 ////var a=19 ////a:=19 ////简略声明的小特殊(冒号前,至少有一个未定义的变量即可) //b,a:=17,18 // //fmt.Println(a,b) //7 变量类型是固定的 //var a int=18 //var a=18 //a:=18 //a=80 //a="xxx" //不可以 //fmt.Println(a) //Printf,%T表示类型 Printf不会自动换行,要换行加上\n //fmt.Printf("age的类型是:%T,值是:%d\n", age, age) //fmt.Println(age) /* 注意: 1 变量定义了,必须使用,否则报错 2 包导入了,要使用,不使用就报错 3 先定义再使用 4 不能重复定义 5 类型固定 */ } /* 在python中一切皆对象,对象就是个地址是引用 */
/* ########### 常量:恒定不变的量,建议常量全用大写 程序运行过程中,不会改变的值,数据库的连接地址,端口号 ########## */ package main func main() { //1 const关键字 常量名 常量类型 =值 //const age int =99 //2 常量可以定义了不使用 //const age int =99 //3 类型可以省略 //const age =99 //fmt.Printf("%T",age) //4 同时定义多个常量 //const ( // AGE=19 // NAME="lqz" // sex="男" //) //fmt.Println(AGE) // ////5 改变常量(不允许) //AGE=199 //fmt.Println(AGE) }
/* ########### 基本数据类型 ########## */ package main func main() { /* 1 数字类型 有符号整形:(长度不同,表示的数字范围不一样) -int:在32位机器上是int32,在64位机器上是int64 -int8 :8个bit位,一个字节,正负 2的7次方-1的范围 -int16: 正负 2的15次方-1的范围 -int32: -int64: 无符号整数: -uint8 :2的8次方-1 -uint16: -uint32 -uint64 浮点型: -float32:精度不一样 -float64:一般用64 复数: -complex类型:(了解,不知道更好)实部和虚部 其他: -byte:uint8的别名 -rune:int32的别名 //2 字符串类型:用双引号包裹的内容,反引号 `` 反引号可以换行 双引号换行加\n //3 布尔类型 true false (小写) */ //var a int=200 //var a uint8=-200 //fmt.Println(a) //浮点型 //var a float32 //var b float64 //复数 //var a complex64 = 9i+10 //fmt.Println(a) //字符串 // var name string ="lqz \n" + // "is " + // "big" // //var name = "lqz" // var name2 = `egon // is //big` // fmt.Println(name) // fmt.Println(name2) //双引号内如果有双引号? 加\转义 //var name string ="lqz \"dafds\"is " //var name1 string =`lqz "dafds"is ` //fmt.Println(name) //布尔类型 //var a bool =true //var a =true //a :=true //var b bool =false //fmt.Println(a) //fmt.Println(b) //类型转换(强类型:不通类型之间不能做运算) //类型转换 //var a int =19 //var b float32=18.1 //float转成int类型,小数点后直接弃用,不是四舍五入 //fmt.Println(a+int(b)) //var b float32=18.9999 //fmt.Println(int(b)) //恶心的地方(了解) //var a int =199 //64为操作系统int64 //var b int64=199 ////int和int64不是一个类型 //fmt.Println(a+int(b)) }
跨平台编译成linux下可执行文件,搞到你虚拟机里执行一下
在xx.go所在的的文件夹, 进入cmd,执行下面的命令
set GOARCH=amd64 set GOOS=linux go build xx.go
会生成一个没有后缀的xx二进制文件
将该文件放入linux系统某个文件夹下
赋予权限
chmod 777 xx
执行
./xx
运行成功,该二进制文件不需要go的任何依赖,可以直接运行。
总结:
# 1 python中的变量在内存中如何存储的? --一切皆对象:都是一个地址,引用 --变量 --is 和 ==:如果变量a和b指向同一个地址a is b 就是true a和b的值相同,a==b是true --小整数池,不开辟新的内存空间 --python中一个int类型,占得空间比较大 # 2 go语言介绍 # 3 环境搭建(ide+开发包) # 4 helloworld :每个go文件第一行必须加package maim/其他,main包下的main函数是整个程序的入口,导包 -为什么要配置goroot和gopath? -导入包:内置包,第三方包,如果不配goroot(内置包路径)和gopath(第三方包,自己写的都在其src路径下),导包时,内置包找不到,第三方包也找不到,就报错了 # 5 变量定义:三种方式,其他都是变形: -var a int =10 -var a =10 -a :=10 -变量不能重复定义 -变量要先定义后使用 -变量定义了必须使用 -变量类型是固定(在定义的那一刻) # 6 常量:const a int =10 const a =10 # 7变量类型: -数字类型: -int,int8。。。。。。 -uint8。。。。。 -float32 float64 -复数 -字符串:string "",`` -布尔 bool