- 博客(90)
- 收藏
- 关注
原创 Golang:go开启web服务
golang开启web服务需要用到net/http包需要用到的函数有handle,函数必须要有http.ResoponseWriter,*http.Reuqest需要用到的方法有http.HandleFunc,http.ListenAndServer。
2022-07-18 12:02:11
802
转载 MYSQL:使用锁解决并发下的更新丢失问题
MYSQL使用锁解决并发下的更新丢失问题序言更新丢失是指并发下两次更新同时进行,后一次更新覆盖了前一次更新的情况,更新丢失是数据没有保证一致性导致的。举个栗子:用户A在银行卡有100元钱,某一刻用户B向A转账50元(称为B操作),同时有用户C向A转账50元(称为C操作);B操作从数据库中读取他此时的余额100,计算新的余额为100+50=150C操作也从数据库中读取他此时的余额100,计算新的余额为100+50=150B操作将balance=150写入数据库,之后C操作也将balance=1
2022-01-26 15:27:12
377
原创 PHP:关于PHP商城秒杀防止超卖问题
关于PHP商城秒杀防止超卖问题序言:在同样对数据操作的代码下,redis事务比lua脚本还要慢上许多,会偶尔出现1-10单超卖的现象。如果想要使用redis事务,删减库存的情况,用redis->decr递减库存,不要用程序自带的加减法,这样效果会好一些推荐使用lua脚本加redis注意redis事务与mysql的事务不一样,缺少了原子性lua+redis:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。实现思路:在设置秒杀活动的时候,把秒杀商品库存存入redis
2022-01-25 16:35:34
2054
原创 Golang:channel管道与goroutine协程
channel管道与goroutine协程一.goroutine协程一.概述Go协程的特点有独立的栈空间共享程序堆空间调度是由程序员(用户)控制协程是轻量级的线程在go语言中,有一种模式叫做MPG,M表示内核线程,也可以称为一个工作线程,P代表执行一个go代码片段的基础(上下文环境),G表示协程,一个线程可以有多个协程。在go语言中可以轻轻松松的启动上万个协程,换做别的语言就不行,这也是go语言的一个特点多线程程序在单核上运行叫做并发多线程程序在多核上运行叫做并行主函数执行并
2022-01-17 11:49:22
294
2
原创 Golang:Golang单元测试
Golang单元测试一.概述import “testing”testing 提供对 Go 包的自动化测试的支持。通过 go test 命令,能够自动执行如下形式的任何函数func TestXxx(*testing.T)其中 Xxx 可以是任何字母数字字符串(但第一个字母不能是 [a-z]),用于识别测试例程。要编写一个新的测试套件,需要创建一个名称以 _test.go 结尾的文件,该文件包含 TestXxx 函数,如上所述。 将该文件放在与被测试的包相同的包中。该文件将被排除在正常的程
2022-01-16 17:00:57
300
原创 Golang:Golang解析程序启动附带指令,Flag包
Golang解析程序启动附带指令,Flag包一.简介flag包实现了命令行参数的解析。常用到的就是flag.StringVar()和flag.IntVar在所有flag都注册之后,调用flag.Parse()来解析命令行参数写入注册的flag里。解析之后,flag的值可以直接使用。如果你使用的是flag自身,它们是指针;如果你绑定到了某个变量,它们是值。二.代码块package mainimport ( "flag" "fmt")func main() { var (
2022-01-15 16:53:36
500
原创 Golang:Golang文件操作
Golang文件操作一.文件操作1.关于文件操作需要使用到os包os.open 打开文件流 返回一个file指针file.close 关闭文件流读取文件是对文件的一个输入流写入文件是对文件的一个输出流二.实例1.打开一个文件流要记得用defer关闭一个文件流,否则会内存泄漏2.读取文件流内容读取文件内容,需要用到bufio包bufio.NewReader()(带缓冲区的方式打开,适合打开较大的文件)reader.ReadString()(读取文件)io
2022-01-14 21:58:54
645
原创 Golang:Golang面向对象编程/接口编程
Golang面向对象编程/接口编程一.Golang面向对象编程介绍众所周知在编程语言里,面向对象编程是创建一个对象,来模拟实际行为与属性,比如创建一个“人”的对象,那么“人”的身高,年龄,体重,就是这个对象的属性,如果这个对象想要跑步,打篮球,打羽毛球,学英语,那么这个就是对象的方法然而在golang里面并没有像其它编程语言一样有class类或者this指针还有new对象方法,只有一个struct结构体来模拟一个对象实例,当然在struct里面也有对象的三大特性,封装,继承,多态,只是与其它变成
2022-01-13 18:41:04
431
原创 Golang:Golang方法声明与使用
Golang方法声明与使用一.Golang方法介绍方法与函数区别函数可以直接用函数名称直接调用,而方法则需要变量+方法名调用方法在传递实例的时候最好传递地址,处理速度会比值传递要快函数在接收一个指针后,需要用到传统(*变量名)拿取指针值,而在方法中底成做了优化,可以直接用变量名拿去值不需要加*号方法在声明的时候需要绑定一个自定义类型如常用的struct,或者init,string,interface都可以在实现了String()方法后会改写默认打印结果二.方法的声明与使用方法的
2022-01-09 14:21:23
604
原创 Golang:Golang结构体声明与使用
Golang结构体一.struct结构体特征go中的结构体有点类似于其他编程语言中的对象go中的结构体可以用.语法访问里面的属性/字段go中的结构体别名和属性/字段首字母需大写否则别的包无法访问此结构体类似于private和publicgo中的结构体属性/字段重复赋值会覆盖之前的值go中的结构体是值类型,不是引用类型go中的结构体如果在使用json转义的情况下,想要发送给客户端的属性/字段不是大写必须加上tag标签如json:xxx属性/字段名二.struct结构体声明和使用结构体声
2022-01-08 17:19:09
2439
原创 Golang:Golang介绍map和声明map
Golang声明map一.map的介绍在声明map的时候是不会自动分配内存的,必须使用make进行内存分配map是[key]value结构map是无序的map的key可以是结构体,slice,int,string,channel但是百分之90都是使用int和stringmap的key不能使用func,mapmap的key是不可以重复的,但是value可以二.map的声明声明mapmap的key不能重复否则会覆盖之前值三.代码块package mainimport "fmt
2022-01-05 22:59:24
348
原创 Golang:Golang处理错误信息或自定义错误信息
Golang处理错误信息或自定义错误信息前言:在golang中,程序遇到错误后系统会抛出一个panic恐慌错误,会停止程序,中断程序执行,但是我们有的时候又不想程序错误后中断程序,那我们就要进行捕获错误信息并且处理一.Golang处理错误信息捕获错误信息会用到defer还有recover,接下来我们看代码在sub01函数中发生了错误导致接下来的代码不会继续执行,我们加上defer,recover解决此现象可以看到defer+recover捕获了错误信息,并且处理了错误信息,不会导致程序中断
2021-12-26 19:10:49
1194
原创 Docker容器:Docker自定义网络
Docker自定义网络一.自定义网络介绍1.介绍常规docker容器启动,可以用–link,进行容器网络绑定,但是一旦容器多了之后就会非常麻烦,所以要自定义一个docker网络,小白推荐使用–link命令自定义网络修复了docker0的容器之间无法用容器名相互ping通的问题,只能使用ip才能ping通,但是我们自定义的网络是可以用ip或者容器名相互ping通的2.命令自定义网络命令说明docker network create创建自定义网络docker netw
2021-12-18 15:50:38
839
原创 Docker容器:Dockerfile自定义镜像
Dockerfile自定义镜像一.构建Dockerfile流程创建Dockerfile文件,文件名官网推荐使用Dockerfile,在docker build 时候会自动识别Dockerfile,如果换了自定义文件名则要加上-f 指定文件路径
2021-12-12 23:45:12
2212
原创 Docker容器:Docker数据卷挂载
Docker数据卷挂载一.数据卷挂载个人看法 # 在Docker中数据卷挂载有这几种不同的方式 # 1. 在docker run 的时候 使用 -v 宿主机目录:容器目录 持久化数据卷挂在到本地 删除容器后 本地数据不会被删除 # 2. 在docker run 的时候 使用 --volumes-from 数据卷容器id 来达到容器互相同步数据 可以多个容器绑定进行数据同步,只有删除了全部数据同步的容器数据卷才会消失 # 3. 还可以在docker build的时候进行容器数据卷挂载数据卷命
2021-12-12 13:05:27
5027
原创 Docker容器:Docker常用容器命令
Docker常用容器命令一.常用容器命令命令说明docker ps查看运行的容器docker run xxxxxx运行容器名称或者镜像id 里面还有很多参数到下面会说docker rm -f xxx删除容器 xxx是容器名称 -f是强制删除容器docker exec -it xxx /bin/bash进入容器内部 xxx是容器名称docker cp 容器id:容器内部目录 宿主机目录容器内部拷贝文件到宿主机docker start 容器id或名
2021-12-09 18:11:54
2701
原创 Docker容器:Docker常用镜像命令
Docker常用镜像命令一.官网查看docker的镜像官网查看docker的镜像地址https://hub.docker.com/search?q=mysql&type=imagedockerhub官网点击进入搜索出来的镜像,可以查看版本号,下面的tag标签就是要对应相对的版本,如果不输入默认是latest最新版二.镜像命令一.命令命令说明docker pull xxx:tagdocker安装命令 xxx代表镜像名称 tag代表镜像标签也可以说是镜
2021-12-09 16:29:22
533
原创 Docker容器: Linux Docker安装,运行hello-world
Linux Docker安装一.执行Linux yum 安装命令安装docker yum install -y docker二.查看docker版本docker -v修改/etc/docker/daemon.json 配置加速镜像源{ "registry-mirrors" : [ "http://hub-mirror.c.163.com" ]}重启dockersystemctl restart docker三.运行docker hello-
2021-12-09 00:36:50
316
原创 Golang:GO闭包函数与init函数与defer
GO闭包函数与init函数与defer一.init函数init函数是go语言中的初始化函数,优先级在main函数之上init函数经常用来初始化连接(关系型数据或者非关系型数据库)接下来我们看看init函数/优先级init案例1 代码片段package mainimport "fmt"func init() { fmt.Println("init()执行了~")}func main() { fmt.Println("main()执行了~")}// 以上输出// init(
2021-12-05 23:32:39
674
原创 Golang:Go指针特性,值类型和引用类型
Go指针go指针低层是指向一个内存地址 如下图所示下面是运用指针而改变值用&符号取得变量地址,用*符号取得地址值代码快package mainimport ( "fmt")func main () { // 指针 输出变量地址 var number int = 10 //number 地址是: 0xc000012070, 值是:10 fmt.Printf("number 地址是: %v, 值是:%v \n", &number, number)
2021-11-24 22:44:54
3895
原创 Golang:Go的特性
Go的特性特性1. 继承c语言特性,基础数据结构,指针等等2. 每个文件都是一个包,必须要用package进行声明3. 函数有多个返回值4. 并且支持天然并发 goroutine5. 拥有垃圾回收机制 内存自动回收 不需要开发人员管理6. 新增slice make map default(延迟 先进后出)7. 代码可以进行格式化程序编写规则1. go文件后缀必须是 .go结尾2. go在声明了变量或者引入了包必须要使用3. go程序区分大小写4. go程序代码结尾不用加;分号
2021-11-21 16:26:28
3856
原创 Golang:fmt包Scanln在控制台获取用户输入的值
一.fmt.Scanln在控制台获取用户输入的值代码块 package mainimport "fmt"func main() { // 在控制台录入数据 Scanln var name string // 姓名 fmt.Println("请输入姓名") fmt.Scanln(&name) var age int // 年龄 fmt.Println("请输入年龄") fmt.Scanln(&age) var height float32 // 身高
2021-10-29 23:49:35
664
原创 Golang:Go的数组声明/数组切片
一. 数组Array数组:是同一种数据类型的固定长度的序列。数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1for i := 0; i < len(a); i++ {}for index, v := range a {}访问越界,如果
2021-10-26 18:07:57
1214
原创 Golang:Go的变量声明,字符类型
一.变量的字符类型常用的基本类型说明bool布尔值int整型folat浮点型字符串二.变量的声明 大家可以看到变量声明和php大不一样,`go语言`变量声明用的是`var`声明变量,而`PHP`用的是`$`符号声明变量,然后在go语言单中声明了变量必须要使用,不使用会抛出异常错误,在声明变量之后可以进行对变量声明type状态,如果不声明状态则默认为以下 可以看见,`整型默认值为int`,`folat默认值为folat64`,这里需要注意一下,
2021-10-25 23:53:41
141
原创 Golang:安装本地环境,运行hello world
一.安装本地环境进入golang社区 下载本地安装包https://studygolang.com/dl根据自己电脑系统进行下载安装更改go env 文件,开启 module,更换镜像源go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn安装vs code 或 goland 编辑器二.创建go文件 xxx.gogo 代码块package mainimport "fmt"func main()
2021-10-24 17:34:37
1894
原创 Redis6+PHP:实现根据经纬度计算出附近门店距离
一. 开始介绍: Redis GEO1.Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。Redis GEO操作方法geoadd添加地理位置的坐标geopos获取地理位置的坐标geodist计算两个位置之间的距离georadius根据用户给定的经纬度坐标来获取指定范围内的地理位置集合georadiusbymember根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合geoha
2021-10-20 16:26:07
1748
原创 PHP+Workerman即时通讯技术:在线聊天/客服/访客功能
PHP+Workerman即时通讯技术:在线聊天/客服/访客功能1:客服端2:客户端3:多访客4:聊天表情客服端http://videolaravel.zwzgjl.com/index.php/admin/login账号:kefu001密码: a123456客户端http://videolaravel.zwzgjl.com/Workerman/index访客无需账号/密码ps:先登录客服 在登陆访客 有任何bug可以发送邮件至:gz341500@163.com 周末更新!
2021-10-20 14:47:33
677
7
原创 Git:【Git】基础常用命令,【Linux】常用命令
Git:【Git】基础常用命令,【Linux】常用命令一.【Linux】常用命令目录操作命令命令cd目录cd /切换到根目录cd /usr切换到根目录下的usr目录cd …/切换到上一级目录 或者 cd …cd ~切换到home目录cd -切换到上次访问的目录目录查看命令ll目录查看ls查看当前目录下的所有目录和文件ls -a查看当前目录下的所有目录和文件(包括隐藏的文件)ls -l 或 ll
2021-10-19 17:47:17
225
原创 PHP:【商城后台管理系统】部署友情链接,网站基础设置
PHP:【商城后台管理系统】部署友情链接,网站基础设置一.友情链接①友情链接页面②友情链接编辑③友情链接添加二.网站基础设置①后台网站基础设置页面②网站基础设置效果三.部署流程部署流程后端采用thinkphp6.0,首先是网站基础设置,网站基础在数据库中可以建立一个单独的表,但是这个单独的表存放的信息很特殊,表里可以存商品规格,或者别的数据,因为这个网站设置就是设置网站的tdk,表字段的名称是这样的,id,names,values,就只有这两个字段,names的字段可以
2021-10-19 17:46:42
731
原创 PHP:【商城后台管理系统】部署角色管理,角色添加,菜单权限,删除角色功能
PHP:【商城后台管理系统】部署角色管理,角色添加,菜单权限,删除角色功能一.角色管理界面①首页②角色添加③角色编辑④角色删除二.部署流程部署流程后端采用thinkphp6.0框架,角色管理看似简单,但是在菜单权限这一块是很难得,为什么难呢?因为要设计菜单无限级构造树,还要将无限极菜单构造树递归遍历成二级菜单,这样才好将菜单渲染到视图层,在代码块注释中将有这些问题的解决方案。前端采用Layui框架HTML 代码块<!DOCTYPE html><
2021-10-18 11:51:01
2394
6
原创 PHP:【商城后台管理系统】部署管理员一级菜单和二级菜单列表添加功能
PHP:【商城后台管理系统】部署管理员一级菜单和二级菜单列表添加功能一.1级菜单和2级菜单列表添加页面一级菜单二级菜单二.部署流程数据库后台菜单列表,字段设置,pid 是 菜单列表级别,0代表1级菜单,>0的是二级菜单,并且二级菜单pid字段值需要对应mid字段值,这样才可以相互绑定。每个菜单对应的还有Controller控制器,action方法,都要一一记录,这样才能映射到thinkphp控制器层还有视图层,用来区分每一级菜单的前端视图框架采用ThinkPHP6.0
2021-10-18 11:50:06
1701
原创 PHP:【商城后台管理系统】部署管理员列表,添加/编辑/删除功能
PHP:【商城后台管理系统】部署管理员列表,添加/编辑/删除功能请点击->友情连接在线测试后台管理页面一.管理员列表界面二.部署流程部署流程thinkphp:使用thinkphp6.0 ,在数据库表里每个管理员都有相对应的id字段,我们点击编辑的时候,会自动获取管理员id字段,进行判断点击的是哪个管理员,当我们修改信息的时候,会判断所填的信息是否为空,如果不为空则添加或修改成功,会默认给一个修改和添加时间,删除就是判断当前点击的管理员字段id,进行where条件查找,然后进行删
2021-10-18 11:48:01
1324
1
原创 PHP:【商城后台管理系统】部署管理员未登录拦截,进行重定向
PHP:【商城后台管理系统】部署管理员未登录拦截,进行重定向一.未登录拦截界面二.部署流程部署流程thinkphp:使用thinkphp6.0 BaseController 里面的初始化控件进行重定向拦截,我们在管理员登陆成功后会进行存储session,然后我们进行判断session里面是否有用户的存储信息,如果没有则进行重定向到登录页面,如果有用户信息则返回json格式给前端HTML 代码块exit('<!doctype html> <h
2021-10-15 09:46:39
298
原创 PHP:【商城后台管理系统】admin超级管理员后台操作界面部署{无限级菜单}
PHP:【商城后台管理系统】admin超级管理员后台操作界面部署{无限级菜单}一.超级管理员后台操作界面二.部署流程界面部署流程页眉栏:采用layui 50px 经典蓝 自设置用户信息Session 进行输出用户名称和用户级别左侧导航栏{无限级菜单} :采用layui 手风琴和左侧导航框架进行样式设计,通过连接后台数据库导出数据表中数据渲染导航列表,分为一级菜单和二级菜单主操作区:采用传统 iframe 内联框架进行部署主操作区高度设置:采用css position 定
2021-10-15 09:45:55
3188
1
原创 PHP:【商城后台管理系统】admin超级管理员后台登录界面部署
PHP:【商城后台管理系统】admin超级管理员后台登录界面部署一.后台管理登录非空验证二.后台管理登录用户信息验证三.注意事项需要注意储存用户password的时候需要进行加密存储password的时候 优先选择password_hash 比 md5 更安全如果使用md5 加密 请加严处理HTML 代码块<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /
2021-10-15 09:45:20
3120
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人