内容概要
- Go语言介绍
- Go语言环境搭建
- 第一个hello world
- 变量的定义与使用
- 变量命名规范
1、Go语言介绍
// 1 Go 即 Golang,是 Google公司2009年11月正式对外公开的一门编程语言--》很新
-python:1989年
-java:1990年
// Golang和Goland是什么关系?
-Golang 编程语言
-Goland jebrains公司出的编辑器,写go代码的,跟pychrm是一个东西
// 2 Go 是静态 强类型语言,是区别于解析型语言的 编译型语言(静态:类型固定, 强类型:不同类型不允许直接运算)
解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行
编译型语言——源代码编译生成机器语言,然后由机器直接执行机器码即可执行
python 动态 强类型,你定义函数时,如何规定类型
-强类型:不同类型之间不能直接运行,需要做类型转换,数字+字符串
java 静态 强类型---》有的人说 它不是编译型---》编译成字节码文件
-数字+字符串 可以---》违背了强类型?---》隐士类型转换:自动识别并做类型转换,运算
js 动态 弱类型
-数字+字符串 允许
// 3 Go语言特性
跨平台的编译型语言 ---->夸平台 编译
-python 夸平台,解释型,解释器有不通平台,代码运行在不同平台
-你们给客户开发的程序,部署在客户机器上---》你的代码,客户就能拿到--》泄露代码了
-没有特别好的方案:
1 直接打包成可执行文件 pipinstall
2 有些第三方代码加密,兼容性很差
3 把代码放到docker镜像中-->docker run -e pasword=123
-从环境变量把password取出来,程序中执行之前先校验这个秘密是否授权,如果没授权,容器不能运行
4 把程序运行起来---》硬盘加载到了内存--->直接把源代码删掉---》该运行运行
-js ---》代码混淆---》正常格式的js---》坨到一起,变量函数名都是魔鬼变量--》压缩
-js逆向
-go 跨平台 编译
-可以在不同平台编译出不同平台的可执行文件--->交叉编译
-c 不夸平台 在不同平台编译
-redis--》源码下载---》make & make install
语法接近C语言
管道(channel),切片(slice),并发(routine)
有垃圾回收的机制
支持面向对象和面向过程的编程模式---》面向对象 有类的概念,没有语法
// 4 版本发展
2009年11月7日 weekly.2009-11-06 —— 早期的版本
2012年3月28日 go 1 —— 稳定版版的发布
2015年8月19日 go 1.5 —— 实现的架构变化,同时保留了和旧版本的兼容性,本次更新中移除了”最后残余的C代码”---》go早期底层有c写的(java,python等都是这样的),再往上层不用了,实现了:【自举】--》自己写自己
2018年8月24日 go 1.11 —— modules和WebAssembly支持
-加入了对 go mod 的支持-->由于 go 语言包管理很乱:引入了第三方:vender,mod机制
-GO111MODULE = off, on, auto
2019 年 9 月 go 1.13 — — 改进了 sync 包中的 Pool,在 gc 运行时不会清除 pool。它引进了一个缓存来清理两次 gc 运行时都没有被引用的 pool 中的实例。重写了逃逸分析,减少了 Go 程序中堆上的内存申请的空间--->GO111MODULE默认开启
-别人写的程序---》一般都要求1.13及以上版本
- Go Module 已经可以用于生产环境,鼓励所有用户迁移到 Module
2022年 1.18 版 加入了对【泛型】的支持(python一切皆泛型)
// 5 Go语言应用
-哪些公司在用
-Google
-国内互联网公司,非常喜欢用go,小公司 python---》go
-七牛:国内最早做 go 实践的,国内镜像(豆瓣源--->python写的)
-B站:原来主站php 流量---》游戏(占总营收80%)--> go替换了---》代码泄露了19年
-go 微服务框架》 go-kratos框架
-字节:大量的go,微服务框架--Kitex
-阿里:大部分java,自研的jvm虚拟机---》杭州的公司大部分都用java--》阿里离职了创业
-腾讯: 用
-百度: 用
-区块链公司
// 6 应用领域:服务开发、并发、分布式、微服务等方向
-服务端,微服务:抢java市场
-自动化运维:抢python市场
-区块链
-开源的并发高的软件,用go写的
// 7 Go语言项目
-k8s
-docker
-普罗米修斯---》运维,监控软件---》zabbix--》php
-区块链:BTCD 是用go语言实现的完整节点的比特币实现
-为什么go在区块链界很火---》完整的区块链解决方案代码第一款go开源了
-拿着人家开源的改改名字,二次开发---》做自己的币--》工资给的高
-etcd ,consul。。
// 8 运维工具
-jumpserver :跳板机,堡垒机 python
-ansible :python写的,基于ssh自动化运维工具,远程操作几百台机器,python
-Jenkins : java写的
-salstack :python写的,跟ansible一个类型产品
-zabbix :监控软件 php写的
-普罗米修斯 :监控软件 go写的
// 9 Go语架构
GOPATH 的工作区包含 bin,src,和 pkg这三个:
src —— 源码(包含第三方的和自己项目的)
bin —— 编译生成的可执行程序
pkg —— 编译时生成的对象文件
// 10 go适合做什么
服务端开发
分布式系统,微服务
网络编程
区块链开发
内存KV数据库,例如boltDB、levelDB
云平台
// 11 发展前景
Go语言将登上语言榜前列,与python和Java并列前三甲 ---》10名开外
Go语言称霸云计算
Go将统治下一个10年
目前Go语言已经⼴泛应用于人工智能、云计算开发、容器虚拟化、⼤数据开发、数据分析及科学计算、运维开发、爬虫开发、游戏开发等领域。
Go语言简单易学,天生支持并发,完美契合当下高并发的互联网生态
2、Go语言环境搭建
// 开发go语言---> go sdk---》os,文件处理,网络 包---》1.18版本
// 运行 go ,什么都不需要,就是可执行文件
// 例如开发 python---》要下载 python 解释器--》os,网络模块
-下载地址:https://golang.google.cn/dl/
-一路下一步安装--》已经把安装路径加入到环境变量了--》同时gopath的bin路径也自动加入到啊环境变量了
// 运行python---》解释器
// 快速开发go语言,需要编辑器
-python 开发用pycharm,做数据分析 一般用:Anconda:jupyter,vscode
-go 个人推荐用 goland ---》收费---》jetbrains公司--》与pycharm同出一系
-跟pycharm 之前的使用习惯完全一样,只是换了个语法写
-vscode 免费可以用---》但是写项目还是 goland
-下载编辑器:https://www.jetbrains.com/go/download/other.html
-一路下一步:试用30天,永久试用-->pycharm同理
// 验证是否安装成功
go -version
// 命令
go env // 查看go的环境变量
goroot:go-sdk安装路径
gopath:一般把代码放在里面
GOPATH=C:\Users\liuqingzheng\go // go 代码存放路径
GOROOT=C:\Program Files\Go // go sdk路径
GO111MODULE=on // 是否开启mod模式
GOHOSTARCH=amd64
GOHOSTOS=windows // 默认编译代码是win平台
GOPROXY=https: //goproxy.cn,direct // 下载第三方模块的地址:github和谷歌速度慢--》自行配置国内镜像--七牛云
3、第一个helloworld
package main // 默认写的 每个go文件的第一行,都要写这个,声明该文件属于哪个包,main包
import "fmt" // 导入内置标准库中的fmt包--》像 python--》 import os
func main() { // 写一个main函数,它是整个项目的入口
fmt.Println("HELLO WORLD") // fmt包下的Println函数,会打印到控制台
}
// go 程序要运行,必须有入口,入口是main包下的main函数第一行开始执行,区分python
// python中 __main__,python为了像其他编译型语言一样有个入口
// 命令行命令
go build + go文件名 // 把源代码编译成可执行文件--》默认平台--》可以交叉编译
编译成可执行文件,直接 文件名+回车 执行即可
go run go文件 // 程序员用,编译并执行,生成一个可执行文件,这个可执行文件不在当前目录下,执行完就删除了,但是它有编译的过程(每次改了代码运行,都要重新编译)
// goland中,直接右键run运行,就是编译并运行 vscode中没有右键,只能敲命令来做
// a... 解释
-实际上,没有a...,但是在goland中,编辑器给你自动提示的,你要传什么参数(编译型语言独有),参数类型是什么,vscode就没有
4、变量的定义和使用
package main
import "fmt"
func main() {
// 变量的使用 ---》先定义在使用
// 1.变量的定义 方式一: 完整定义
// var 变量名 + 类型 = 变量值 -- 定义并赋予初值
//var name string = "lqz" // 定义了一个变量 值为 name 值为 lqz
//fmt.Println(name)
// 2.变量定义方式二: 类型推导。虽然是类型推导,但是在定义阶段类型就固定了,后期不能改
//var 变量名 = 变量值 // 自动推导出变量是string类型
//var name ="lqz"
//var age =19
////var age int =99 // 一旦定义过,就不能再定义了
//
//fmt.Println(name)
//fmt.Println(age)
/*
name="彭于晏" // True 修改变量的值 可以
name=19 // False 但是类型要固定,不能改
fmt.Println(name)
*/
// 3.变量定义方式三 简略声明 := 表示定义并赋初值 用的多,但是不代表它没有类型
// 变量名 := 变量值
//name := "lqz"
////name :="pyy" // 重复定义
//
//fmt.Println(name)
// 4.以后见到其他的变量定义方式,都是这三种的变形
//5.同时定义多个变量---》第二种类型推导
// 5.1 这三个变量通过类型推导获得
//var name, age, hobby = "lqz", 19, "篮球"
//fmt.Println(name, age, hobby)
//5.2 表示这三个变量都是string类型 第一种的变形
//var name,age,hobby string = "lqz","19","篮球"
//fmt.Println(name,age,hobby)
//5.3 简略声明的方式
//name, age, hobby := "lqz", 19, "篮球"
//fmt.Println(name, age, hobby)
// 5.4 用括号括起来,第一种和第二种的混合,这种用的多,如果变量不赋初值,是没法类型推到
//var (
// name string = "lqz"
// age int
// hobby = "篮球"
// wife string // 定义没有赋初值
//
//)
//fmt.Println(name, age, hobby, wife)
// 6 补充:变量不能重复定义,但是可以使用 : 的形式---只要左侧有没定义过的新变量,它就算修改值 不会报错
var name = "lqz"
//name:="pyy" 重复定义报错
name, age := "pyy", 19 // 只要左侧有没定义过的变量,这个就不错
fmt.Println(name, age)
}
// python 中所有类型都可以是None---》python一切皆对象(引用)--》地址里没放东西就是None,对着go中是nil,java中null
/*
go语言想法设法让你少些代码:
// 单行注释 等同于python #
/星星/ 多行注释 等同于python 三引号
注意点:
1 变量定义了必须使用,如果不用就报错,编译不通过
2 变量在定义阶段,类型就固定了,后期不能改
3 变量不能重复定义 无论用那种方式定义过,都不能再定义了,只能使用
*/
5、变量命名规范
// 1 命名规范
Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:
1 一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线
2 大写字母和小写字母是不同的:Name和name是两个不同的变量
3 关键字和保留字都不建议用作变量名 --->内置函数,包,关键字不能做变量名
// 2 25个关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
目前你认识的:func,var, package,if,else,break,continue
python 中的 and or 在go中不是关键字
// 3 go语言中有37个保留字,主要对应内建的常量、类型和函数-->学了就会了
对比 python 的 input,print,可以做变量名,但是不建议
内建常量: true false iota nil
内建类型: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
内建函数: make len cap new append copy close delete
complex real imag
panic recover
// 4 注意
-go变量定义推荐用驼峰 AgeOfPerson java中也是
-python中推荐下划线 age_of_person
-go大小写有特殊含义
-go的文件命名推荐用下划线
-go变量定义推荐用驼峰,go的文件命名推荐用下划线
-python 变量和py文件都推荐用下划线
-java 变量和java文件都推荐用驼峰
-go 变量定义推荐用驼峰,go的文件命名推荐用下划线