自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

咳咳,请多指教

额,别当真,乱写的

  • 博客(91)
  • 收藏
  • 关注

原创 gorm 关联关系小结

学以致用 实践例子而已

2022-07-06 11:12:04 507 1

原创 go time包常用函数

time 包使用方法

2022-07-04 11:38:28 352

原创 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 1024

原创 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 401 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 199

原创 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 240 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 627

原创 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 993

转载 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 127

转载 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 92

原创 Go channel 通道

channel类型单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。虽然可以使用共享内存进行数据交换,但是共享内存在不同的 goroutine 中容易发生竞态问题。为了保证数据交换的正确性,很多并发模型中必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。Go语言采用的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。如果说 goroutine 是Go程序并发的执行体,

2022-03-08 13:48:30 105

原创 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 138

原创 go 结构体

结构体:可以封装多个基本数据类型为一个整体,生成一个新的类型-1.结构体的定义规则类型名:标识自定义结构体的名称,在同一个包内不能重复。字段名:表示结构体字段名。结构体中的字段名必须唯一。字段类型:表示结构体字段的具体类型。-2.声明一个标准的结构体//定义一个简单的结构体type 类型名 struct { 字段名 字段类型 字段名 字段类型 }//定义结构体type Person struct { name string age int city s

2022-03-07 16:08:53 108

原创 Go 接口

接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。了解为什么需要接口以及接口的特点掌握接口的声明和使用 掌握接口值的概念掌握空接口的特点及其使用场景在Go语言中接口(interface)是一种类型,一种抽象的类型。相较于之前章节中讲到的那些具体类型(字符串、切片、结构体等)更注重“我是谁”,接口类型更注重“我能做什么”的问题。接口类型就像是一种约定——概括了一种类型应该具备哪些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。pack

2022-03-07 13:41:09 78

原创 习题:增删改查 学生信息

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 130

原创 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 214

原创 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 66

原创 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 143

原创 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 49

原创 Go匿名函数 & 闭包函数

1.匿名函数func main(){ //匿名函数 直接调用 (函数最后 ()) func() { println("我是匿名函数 立即执行") //我是匿名函数 }() //匿名函数被动调用 将匿名函数 赋给 func1 然后 func1 被调用 func1 := func() { println("我也是匿名函数") } func1() // 我也是匿名函数 需要被动调用}...

2022-03-02 16:36:31 176

原创 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 43

原创 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 1904

原创 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 57

原创 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 64

原创 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 86

原创 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 1598

原创 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 653

原创 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 235

原创 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 509

原创 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 77

原创 搭建 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 565

原创 Mac 下 配置 Go 环境变量

1.配置环境变量cd ~ && sudo vim .bash_profile----- 写入以下内容 至 环境变量文件内 ----------export GOROOT=/usr/local/goexport GOPATH=/Users/liuweiliang/gopathexport GOBIN=$GOROOT/binexport PATH=$PATH:$GOBIN2.使环境变量生效source ~/.bash_profile...

2022-02-08 11:00:31 1498

原创 Laravel Get、Cursor、Chunk、Offset 对比

1. Getpublic function testGet(){ $start = microtime(true); $num = 0; $rs = TestModel::get(); foreach ($rs as $v) { $num++; } $end = microtime(true); echo $num . PHP_EOL; echo ($end - $start) . PHP_EOL; $mem

2021-11-15 11:57:49 1197

转载 laravel技巧

1.控制器单行为控制器当你的控制器仅有一个方法的时候,不妨尝试下 __invoke() 方法来,让当前控制器变身为 "invokable" 控制器。单行为控制器的简单使用:定义路由,如下:Route::get('user/{id}', 'ShowProfile');通过命令创建单行为控制器:php artisan make:controller ShowProfile --invokable修改控制器代码,如下:class ShowProfile extends Control

2021-11-15 09:37:33 536

原创 Laravel elasticsearch 案例

前置开发环境 Laravel 8 Docker mysql 5.71.数据库CREATE TABLE `posts` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL DEFAULT '', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `d

2021-11-12 15:16:26 3030

原创 Laravel 8.63.0 之 RabbitMQ 生产&消费案例

场景:微服务中,会遇到这样的案例:用户申请提现,总后台(后台服务)审核通过,通知资金服务 更新数据;1.安装 composer 包composer requires php-amqplib/php-amqplib ^2.122.追加配置 config/queue 后 执行 php artisan config:cache'rabbitmq' => [ 'driver' => 'rabbitmq', 'hos

2021-11-10 16:25:02 1886

原创 Laravel 使用 RabbitMQ 案例

1. 首先安装 PHP 扩展 amqp 2.Docker 安装 RabbitMq 找到 docker-compose.yml rabbitmq: container_name: xb_rabbitmq # 容器名称 image: rabbitmq:management # 镜像 networks: - wb_net ports: - 15673:15672 - 5673:5

2021-11-09 15:42:07 1240

原创 ubuntu php74 下 安装 amqp

获取资源wget -c https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-1.10.2.tar.gz解压缩资源tar zxf rabbitmq-c-1.10.2.tar.gz进入资源目录cd rabbitmq-c-1.10.2编译phpize./configuremakemake install找到 ini 文件位置find /etc -name "php.ini"写入配置文件

2021-11-09 13:24:50 1731

原创 raw.githubusercontent.com 安装失败

https://tool.lu/ip/将 IP 放到 hosts 文件内如果有个 vpn 效果更加明显

2021-11-09 09:28:31 304

原创 Laravel Redis 订阅发布

场景:当生产者 产生一个用户id,消费者获取到用户id 取更改用户状态;前提准备:1. composer require predis/predis2. env 文件 更新 CACHE_DRIVER = redis 3. env 文件 新增 REDIS_CHANNEL = edit_user_channel4. 新增 config/common.php 并写入以下内容 后 并执行: php artisan config:cachereturn [ 'edit_user

2021-11-08 14:24:22 838

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除