1 go语言基础:
1.go语言结构:
pakage main 表示一个可独立执行的程序
Import “fmt” 表示程序需要引入fmt包(函数或元素)
func mian():main函数是每一个可执行程序所必须包含的(主函数:入口函数)
{ 左大括号不能放在单独的一行
go语言不需要使用;结尾
Go语言使用fmt.Printf格式化字符串并赋值给新串
%d表示整形数字
%s表示字符串
%v表示按原值输出
fmt.Printf(“name is : %s, age is %d\n”,name,age)
还有另一种写法:
fmt.Println(“name:”,name)
2.go语言数据类型
布尔:默认为false
数字:默认为0
字符串
派生类型
3.go语言变量:
使用var声明
i :=1 等同于var i int = 1
这种因式分解的写法一般用于声明全局变量var (
a int
b bool
)
这种不带声明格式的只能在函数体中出现c , d :=123 , “hello”
int、float、bool、string这些基本类型属于值类型
交换两个变量的值 a, b = b , a(前提是两个变量的类型必须相同)
空白标识符_可以用来抛弃值:如5在_ , b = 5, 7中被抛弃
_实际上是一个只写变量,你不能得到它的值。这样做是因为go语言中你必须使用所有被声明的变量,但有时你并不需要从一个函数得到所有的返回值。
go语言常量
使用const声明
iota表示可改变的常量,从零开始依次+1递增
go语言运算符
位运算:
<<:左移运算符:(A为60)A<<3 表示乘以2的3次方,结果为:480
>>:右移运算符:A>>2表示除以2的2次方,结果为15
go语言条件判断语句:
if a <20 {
fmt.Println(“已执行”)
}
go语言循环语句:
(1)for i:= 1 ; i <= 10 ; i++{
Sum +=1
}
(2)使用for range可以对字符串、数组等进行迭代输出元素
numbers := [6]int{1,2,3,4}
for i,x := range numbers {
fmt.Printf(“第%d位的x值 = %d\n”, i,x)
}
go语言函数
函数由func开始声明
func max(num1, num2 int)int{
var result int
If num1 > num2{
result = num1
}else{
result = num2
}
return result
}
回调函数
闭包:匿名函数
go语言变量作用域
局部变量可以和全局变量名字相同,会优先使用局部变量的值
go语言数组
var i = [3]int{1,3,2}
i := [3]int{1,2,3}
当数组长度不确定时:var i = [...]int{1,2,3}
二维数组:i := [][]int{}
定义一个三行四列的二维数组:
a := [3][4]int{
{1,2,3,4},
{4,5,6,7},
{7,8,9,10},
}
go语言指针:
定义指针:var ip *int
当一个指针被定义后没有分配到任何变量时,它的值为nil
nil指针也称为空指针(与java中的null)
go语言结构体
相当于java中的对象
type Books struct{
title string
author string
subject string
book_id int
}
go语言切片(动态数组)
声明一个未指定大小的数组定义切片:var i []int
go语言的map集合
元素无序
创建map集 合
var i map[string]string
或者 i := make(map[string]string)
delete() 删除集合元素
go语言递归函数
(1)函数调用本身:
func recursion(){
Recursio5n()
}
(2)递归实现阶乘
go语言数据类型转换
go不支持隐式转换,必须声明转换的数据类型
go语言错误处理
Errors.New(“执行出错”)
go语言并发:
通过go关键字来开启新线程
通道:(channel)是用来传递数据的一个数据结构
声明通道:用chan关键字ch := make(chan int)
通道缓冲区:通过make的第二个参数指定缓冲区大小
ch :=make(chan int , 100)
配置go的环境变量
GOPROOT:SDK的安装目录
path:%GOROOT%\bin
GOPATH:go工程存放的目录
docker、k8s、以太坊都是用go语言开发的
Go语言项目,需要有特定的目录结构进行管理,不能随便写,一个标准的go工程需要有三个目录:
src:放我们自己的源代码
bin:编译程序之后,使用标准命令go install之后存放的位置
pkg:缓存包
go的特点
shell是解析型语言
Go语言是编译型语言,需要编译成另一个可执行文件
Go是强类型文件,python是弱类型语言
Go程序在运行的时候不需要依赖外部库,执行时把需要的所有库都打包到程序中,所以go程序比较大
Go的同一套代码在编译时可以指定不同的运行系统,跨平台非常强大
Go的变量声明了必须要使用,不要会报错
go语言在window下编译不太方便,可以配置终端为linux
在开发工具中设置找到Terminal,然后将cmd.exe替换成Git安装目录bin目录的bash.exe
go相关命令:
go build -o xxx.exe xxx.go
go run xxx.go(直接运行,不编译成exe文件)
go install:可以将应用程序安装到GOBIN下面
go env:可以查看当前go的环境变量
基础数据类型
int、int8、int32、int64、uint8...uint64、float32、float64、true、false
go语言只有i++ 、i-- 没有++i和--i 自增语法必须单独一行
go语言指针
name:=”ddd”
prt:=&name
fmt.Println(*prt)//值
fmt.Println(prt)//指针
go语言能返回栈上的指针
go语言不支持的语法
不支持--i和++i
不支持三位运算符 ?:
细节:
每次创建新项目必须要初始化:go mod init 并且在设置里面开启版本管理。这然才能引入自己指定的依赖包
Lunix下面运行go build报下面这个错:fatal error: pcap.h: No such file or directory
解决办法:centos需要安装libpcap-devel
执行yum install libpcap-devel
go在redis中get字符串类型的数据:(不能直接获取,需要用redis.string()将数字数组转为字符串)
Myvalue,err := redis.string(conn.Do(“get”,”mykey”))
2 go连接redis
redis使用红黑树作为索引(因为redis是键值对存储数据,用红黑树效率高)
1.Go操作redis:
(1)链接数据库:conn,err := redis.Dial(“tcp”, “192.168.30.130:6379”)
(2)操作数据库:reply,err := conn.Do(“set”,”name”,”fff”)
result,_:=redis.String(conn.Do(“get”,”name”))
(3)回复助手:r,e := redis.String(reply,err)
3 gorm框架
1、grom框架:
(1)它是go语言的ORM框架:对象关系映射---通过操作结构体来操作数据库,不需要使用SQL
(2)grom操作的都是表、表数据----不能操作数据库
gorm默认将id字段作为主键
2.go通过grom操作MySQL
(1)链接mysql:
conn,err := gorm.Open(“mysql”,”root:root@tcp(192.168.30.130)/test”)
(2)借助gorm创建数据库表:
conn.SingularTable(true)
e := conn.AutoMigrate(new (Student)).Error
1.gorm连接池
gorm框架创建好的mysql数据库链接conn,就是一个连接池的句柄
创建全局的变量,来接受句柄:
var GlobalConn *gorm.DB
GlobalConn = conn
对比redis不需要使用Get()方法去取一条连接
4.go函数的几个特性:
(1)go中的函数如果想要包外可见,函数名首字母必须大写,main函数和init函数除外除外
(2)导包的时候如果在包前加一个下划线 - 会让init函数在main函数之前被自动加载
5.gorm框架crud数据
(1)增:result := Globalconn.Create(&stu).Error
(2)查:
First(&user) 获取表中的第一条数据
Last(&user) 获取表中的最后一条数据
Find(&user) 获取表中的全部数据
Select(“name,age”).First(&user) 指定查询第一条数据的具体字段
Select(“name,age”).where(“name=? and age=?”,”zhangsan”,22).Find(&user) 条件查询
(1)改:
GlobalConn.Model(new(User)).Where(“name=?”,”lisi).Updates(map[string] interface{}{“name”:”zhaoliu”,”age”:12}).Error 改多个字段
GlobalConn.Model(new(User)).Where(“name=?”,”lisi).Update(“name”:”zhaoliu”).Error 改单个字段
(2)删:
GlobalConn.Where(“name=?”,”zhaoliu”).Delete(new(Student)).Error 逻辑删除
GlobalConn.Unscope.Where(“name=?”,”zhaoliu”).Delete(new(Student)).Error 物理删除
6.mysql的8小时时区问题
Mysql默认使用的时间:美国东八区时间----北京时间---差8小时
在链接数据库时:
?charset=utf8&parseTime=True&loc=Local
mysql数据库默认有三种时间类型
(1)date
(2)datetime
(3)timestamp --时间戳
在gorm中只支持timestamp ,但是可以用type关键字指定时间类型:`gorm:”type:timestamp”`
7.mysql64机位最大支持8T存储
8.go采用oss对象存储图片,将图片地址存在mysql,并缓存在redis中