![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
GO
咳咳,您好请多指教!
咳咳,您好请多指教!
展开
-
gorm 关联关系小结
学以致用 实践例子而已原创 2022-07-06 11:12:04 · 477 阅读 · 1 评论 -
go time包常用函数
time 包使用方法原创 2022-07-04 11:38:28 · 344 阅读 · 0 评论 -
gin 操作日志实现步骤
goBlog 项目目录1.创建日志文件mkdir storeage/logs/logs.log2.sudo vim bootstrap/logger.go 初始化 日志的文件package bootstrapimport ( "github.com/spf13/cast" "github.com/spf13/viper" "goBlog/pkg/logger")// SetupLogger 初始化 Loggerfunc SetupLogger() { lo.原创 2022-05-18 09:27:47 · 967 阅读 · 0 评论 -
gorm 关联关系
文章表数据语句CREATE TABLE `posts` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `category_id` int(11) unsigned NOT NULL DEFAULT '0', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL原创 2022-03-25 09:18:04 · 322 阅读 · 10 评论 -
gin框架 jwt 如何使用
1.获取 jwt 包go get -u github.com/golang-jwt/jwt2.封装中间件 middlewares/JWTAuthMiddleware.gopackage middlewaresimport ( "errors" "net/http" "strings" "time" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt")var MySecret = []byte("夏天夏天悄悄过去")原创 2022-03-15 23:47:22 · 194 阅读 · 0 评论 -
gin Validator 简单的例子
顶级目录 ginroutes/route.gopackage routesimport ( "fmt" "gin/app/requests" "net/http" "github.com/gin-gonic/gin")func RegisterAPIRoutes(r *gin.Engine) { v1 := r.Group("/v1") v1.GET("hello", func(c *gin.Context) { fmt.Println("helloword") }).原创 2022-03-15 14:47:12 · 229 阅读 · 1 评论 -
gin 框架如何拆分路由
1.bootstrap/route.go 路由 在这里注册package bootstrapimport ( "gin/routes" "github.com/gin-gonic/gin")func SetupRoute(r *gin.Engine) { routes.RegisterAPIRoutes(r)}2.routes/route.go 具体路由package routesimport ( "fmt" "github.com/gin-gonic/gin")原创 2022-03-15 13:20:10 · 594 阅读 · 0 评论 -
gin 框架如何使用 viper 配置并 配合gorm 链接 MySql
gin 框架如何使用 viper 配置并 配合gorm 链接 MySql1.顶级目录 gin2.注册中心 bootstrap/xxx.go 例如:bootstrap/database.go 3.包 gin/pkg/xxx/xxx.go 例如:gin/pkg/database/database.go1.获取 viper & gormgo get github.com/spf13/vipergo get gorm.io/gormgo get gorm.io/driver/mysql原创 2022-03-15 09:12:14 · 957 阅读 · 0 评论 -
Go 互斥锁
package mainimport ( "fmt" "sync")// sync.Mutexvar ( x int64 wg sync.WaitGroup // 等待组 m sync.Mutex // 互斥锁)// add 对全局变量x执行5000次加1操作func add() { for i := 0; i < 5000; i++ { m.Lock() // 修改x前加锁 x = x + 1 m.Unlock() // 改完解锁 } wg.Do转载 2022-03-13 20:46:24 · 121 阅读 · 0 评论 -
GO 习题
I ### 一个简单的工作池package mainimport ( "fmt" "math/rand" "sync")var wg sync.WaitGroupfunc main() { wg.Add(1) go producer(jobChan) wg.Add(20) for i := 0; i < 20; i++ { go consumer(jobChan, resultChan) } for v := range resultChan { fmt.P转载 2022-03-09 17:15:04 · 84 阅读 · 0 评论 -
Go channel 通道
channel类型单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。虽然可以使用共享内存进行数据交换,但是共享内存在不同的 goroutine 中容易发生竞态问题。为了保证数据交换的正确性,很多并发模型中必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。Go语言采用的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。如果说 goroutine 是Go程序并发的执行体,原创 2022-03-08 13:48:30 · 95 阅读 · 0 评论 -
go goroutine
Go语言中使用 goroutine 非常简单,只需要在函数或方法调用前加上go关键字就可以创建一个 goroutine ,从而让该函数或方法在新创建的 goroutine 中执行创建一个新的 goroutine 运行函数f 或 匿名函数go f() 或go func(){ // ...}()package mainimport "fmt"func main() { //开启一个主的 Goroutine 执行 main go hello() //开启一个主的 Gorout.原创 2022-03-08 09:37:16 · 114 阅读 · 0 评论 -
go 结构体
结构体:可以封装多个基本数据类型为一个整体,生成一个新的类型-1.结构体的定义规则类型名:标识自定义结构体的名称,在同一个包内不能重复。字段名:表示结构体字段名。结构体中的字段名必须唯一。字段类型:表示结构体字段的具体类型。-2.声明一个标准的结构体//定义一个简单的结构体type 类型名 struct { 字段名 字段类型 字段名 字段类型 }//定义结构体type Person struct { name string age int city s原创 2022-03-07 16:08:53 · 100 阅读 · 0 评论 -
Go 接口
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。了解为什么需要接口以及接口的特点掌握接口的声明和使用 掌握接口值的概念掌握空接口的特点及其使用场景在Go语言中接口(interface)是一种类型,一种抽象的类型。相较于之前章节中讲到的那些具体类型(字符串、切片、结构体等)更注重“我是谁”,接口类型更注重“我能做什么”的问题。接口类型就像是一种约定——概括了一种类型应该具备哪些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。pack原创 2022-03-07 13:41:09 · 73 阅读 · 0 评论 -
习题:增删改查 学生信息
package mainimport ( "fmt" "sort")func main() { class := &Class{} class.stuinfo = make(map[int]*Student, 50) class.add("lwl", 2, 22, 222) class.add("zq", 1, 11, 111) class.edit("lovezq", 1, 11, 111) //class.delete(2) class.list()}type原创 2022-03-06 21:58:43 · 125 阅读 · 0 评论 -
Go 结构体与JSON序列化
//JSON反序列化:JSON格式的字符串-->结构体 var data = `{"ID":1,"Name":"stu0034"}` var student student json.Unmarshal([]byte(data), &student) fmt.Printf("%#v", student) //JSON序列化:结构体-->JSON格式的字符串 data, err := json.Marshal(class.student) if err != nil {.原创 2022-03-06 19:53:27 · 206 阅读 · 0 评论 -
Go 结构体
初始化 结构体type person struct { name string city string age int8}func main() { var p1 person p1.name = "lwl" p1.city = "杭州" p1.age = 28 fmt.Printf("p1=%v\n", p1) //p1={lwl 杭州 28} fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"lwl", city:"杭州",原创 2022-03-06 17:05:12 · 56 阅读 · 0 评论 -
Go 指针 & 部分结构体
指针 //指针 a := 10 //int类型 b := &a //int类型 int指针 fmt.Println(a, &a) //10 0xc0000b2008 fmt.Println(b) // 0xc0000b2008 //指针变量 c := *b //*是获取指针对应的变量 fmt.Println(c) //10 //指针类型数据必须是有初始化值的 var a *int //原创 2022-03-03 21:39:38 · 116 阅读 · 0 评论 -
GO 内置函数
panic 抛出 500 错误 后续程序终止执行结果:我是a我是b我是panic** 不执行 我是cfunc main() { a() b() c()}func a() { fmt.Println("我是 a")}func b() { fmt.Println("我是 b") panic("我是panic")}func c() { fmt.Println("我是 c")}recover 不会报500 也会终止后续程序 ,必须搭配 defer 使用,一定要在可原创 2022-03-03 12:28:26 · 41 阅读 · 0 评论 -
Go匿名函数 & 闭包函数
1.匿名函数func main(){ //匿名函数 直接调用 (函数最后 ()) func() { println("我是匿名函数 立即执行") //我是匿名函数 }() //匿名函数被动调用 将匿名函数 赋给 func1 然后 func1 被调用 func1 := func() { println("我也是匿名函数") } func1() // 我也是匿名函数 需要被动调用}...原创 2022-03-02 16:36:31 · 151 阅读 · 0 评论 -
Go defer
func defer1() { fmt.Println("start") defer fmt.Println(1) defer fmt.Println(2) defer fmt.Println(3) fmt.Println("end") //start end 3 2 1 用于 资源释放,解锁 处理时间 和 堆栈一个原理 所以 3 2 1}原创 2022-03-02 15:37:19 · 38 阅读 · 0 评论 -
Go func 普通函数
func 函数名(参数)(返回值){ 函数体}//标准函数func1() //hello wordfunc func1() { fmt.Println("hello word")}//接受 string 类型的参数func2("kobe") //hello kobefunc func2(name string) { fmt.Println("hello", name)}//接受多个参数 并返回一个 int值ref := func3(1,2)fmt.Println(r原创 2022-03-02 15:27:28 · 1873 阅读 · 0 评论 -
Go map
引用类型 一定要初始化 才可以使用//map是引用类型 func map1() { //声明一个map var a map[string]int //nil fmt.Println(a == nil) //true //map的初始化 b := make(map[string]int, 5) fmt.Println(b == nil) //false //map 如何添加键值对 b["age"] = 100 b["age1"] = 200 fmt.Println(b)原创 2022-02-28 17:34:59 · 51 阅读 · 0 评论 -
Go Slice
//切片是引用类型func slice() { var a []string fmt.Println(a) //[] var b []int fmt.Println(b) //[] var c = []bool{true, false, true} fmt.Println(c) //[true false true] //基于数组声明切片 aa := [5]int{1, 2, 3, 4, 5} fmt.Println(aa) //[1 2 3 4 5] bb := aa[1:4]原创 2022-02-28 15:17:02 · 59 阅读 · 0 评论 -
Go array
//数组是值类型func array() { var a [3]int var b [4]int fmt.Println(a, b) //[0 0 0] [0 0 0 0] var cityArray = [4]string{"北京", "上海", "杭州", "南京"} fmt.Println(cityArray) //[北京 上海 杭州 南京] var boolArray = [...]bool{true, false, true} fmt.Println(boolArray)原创 2022-02-28 11:21:40 · 76 阅读 · 0 评论 -
gin 框架 如何封装使用 redis
获取 redis 包go get github.com/go-redis/redis/v8封装redis pkg 包// Package redis 工具包package redisimport ( "context" "sync" "time" redis "github.com/go-redis/redis/v8")// RedisClient Redis 服务type RedisClient struct { Client *r原创 2022-02-17 09:32:35 · 1575 阅读 · 0 评论 -
搭建 gin 框架
1.此文为 Go 环境变量配置2.创建工程文件夹 (与 /Users/liuweiliang/gopath 同级 创建 go 工程文件夹)mkdir /Users/liuweiliang/go 工程文件夹cd go && mkdir src && mkdir bin mkdir pkg 功能文件夹3.创建项目cd src && mkdir gin-example && cd gin-example 创建项目go mod in原创 2022-02-08 11:17:11 · 543 阅读 · 0 评论 -
gin框架 文件上传
package mainimport ( "fmt" "net/http" "path/filepath" "github.com/gin-gonic/gin")func main() { r := gin.Default() r.POST("/upload", func(c *gin.Context) { file, err := c.FormFile("file") if err != nil { c.String(http.StatusBadRequest, fm原创 2022-02-08 11:30:29 · 72 阅读 · 0 评论 -
gorm mysql 的使用案例
go get gorm.io/gormgo get gorm.io/driver/mysqlgo get gorm.io/driver/sqlitepackage mainimport ( "gorm.io/gorm" _ "gorm.io/driver/mysql")type Product struct { gorm.Model //嵌入常用字段 Code string Price uint}func main() { db, er原创 2022-02-11 10:12:40 · 502 阅读 · 0 评论 -
gin validator 案例
package mainimport ( "log" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10")func main() { v := validator.New() s := MyStruct{"hello Go"} err := v.Struct(s) log.Printf("%+v", err) s2 := MyStruct{} err = v.Struct(s2) lo原创 2022-02-11 13:55:16 · 226 阅读 · 0 评论 -
gin 如何 封装 参数验证类
1.引入 govalidator 验证包go get github.com/thedevsaddam/govalidator2.封装 验证 pkg// Package requests 处理请求数据和表单验证package requestsimport ( "github.com/gin-gonic/gin" "github.com/thedevsaddam/govalidator")//验证的参数type SignupPhoneExistRequest struct原创 2022-02-16 13:28:08 · 618 阅读 · 0 评论