golang系列

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中


4

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员gelei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值