自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

猛犸象

一只不知疲惫的猛犸

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

原创 javascript中的正则表达式

修饰符:i 执行对大小写不敏感的匹配。g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。m 执行多行匹配。一、javascript字符串提供的功能:var str = 'http://localhost:8089/dist/index.html#/set_product';1、match(regexp: string | RegExp): RegExpMatchArray | null;/*** Matches a string with a regular express

2020-10-30 15:12:15 2558

原创 Vue 中 this.$router 与 this.$route 的区别 以及 push() 方法

官房文档里是这样说明的:通过注入路由器,我们可以在任何组件内通过 this.$router 访问路由器,也可以通过 this.$route 访问当前路由可以理解为:this.$router 相当于一个全局的路由器对象,包含了很多属性和对象(比如 history 对象),任何页面都可以调用其 push(), replace(), go() 等方法。this.$route 表示当前路由对象,每一个路由都会有一个 route 对象,是一个局部的对象,可以获取对应的 name, path, params,

2020-10-30 11:18:34 848

原创 golang中切片slice的使用须知

这篇文章主要理解一个事情:切片是对数组的引用。go version1.14.7乍一看,这个很好理解,但是却很容易出错。切片的主要操作:1、make 创建一个切片。2、len 切片的长度。3、cap 切片的容量。4、append 向切片中填加数据到尾部,实际上是修改底层数组对应位置上的值。5、a = a[:0] 清空一个切片。6、a[0] 访问值。7、copy 复制一个切片。切片的三要素:pointer - 底层数组的某一个元素的地址,不一定是第一个,数组的各

2020-10-25 16:51:25 3582 1

原创 gorm中关于sql日志记录 golang

记录sql的慢查询日志和错误日志是很有必要的。gorm 版本 gorm.io/gorm v1.20.1gorm提供了默认的logger实现:if config.Logger == nil { config.Logger = logger.Default}Default = New(log.New(os.Stdout, "\r\n", log.LstdFlags), Config{ SlowThreshold: 100 * time.Millisecond, LogLevel: W

2020-10-23 15:44:16 14124 1

原创 gin框架全局捕获异常并写入日志文件

gin 的默认启动方式为 debug 模式gin.Default()func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine}func Recovery() HandlerFunc { return RecoveryWithWriter(DefaultErrorWriter)}func RecoveryWith

2020-10-23 08:22:31 6614

原创 使golang程序后台运行

package mainimport ( "os" "os/exec" "time")func main() { args := os.Args daemon := false for k, v := range args { if v == "-d" { daemon = true args[k] = "" } } if daemon { Daemonize(args...) return } for { time.Sleep(time.M

2020-10-21 10:33:32 6363

原创 docker容器中的前台程序和后台程序,为什么一定要前台运行

docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。为了验证这一点,我写了两个go程序并静态编译为可执行程序,common 和 daemon ,他们即可前台运行也可后台运行前台运行./common ./daemon 后台运行./common serve -d ./daemon -d

2020-10-21 10:29:38 10861

原创 使用docker容器运行golang应用以及热更新

golang程序我们一般是先编译好可执行文件,然后发布出去运行,所以在创建docker镜像的时候,我们也使用这种方式,所以golang程序使用容器来运行实在使太方便了。common项目是使用gin写的API接口服务,配合endless实现了 graceful restart。目录结构如下:编译go build common.go 启动命令,前台运行./common serve启动命令,后台运行./common serve -d 或者/bin/man start平滑重启命令/b

2020-10-20 15:58:14 6689

原创 docker镜像制作 - Dockerfile

使用 Dockerfile 制作 docker 镜像的方式很简单,是一种工程化的方式。Dockerfile命令解释一般在项目的根目录下创建 Dockerfile 文件。选择一个基础镜像作为底层,为了使镜像尽量小,一般选择 alpine,如果不想以任何镜像为基础则选择 scratch 。如果基础镜像在本地无法找到,会自动从远程下载。Dockerfile 示例:FROM alpineADD main20 /data/www/CMD cd /data/www && ./main20

2020-10-20 14:04:21 526

原创 Dockerfile文件命令详细说明

环境介绍1.Dockerfile 中所用的文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录。2.Dockerfile 中相对路径默认都是Dockerfile所在的目录。3.Dockerfile 中每一条指令被视为一层,所以能写到一行的指令,一定要写到一行,原因是分层构建,联合挂载这个特性。4.Dockerfile 中指令大写(约定俗成)。指令FROMMAINTAINERLABELADDCOPYEXPOSEENV在Dockerfile中

2020-10-20 10:37:57 1644

原创 使go协程按顺序输出结果

借助一个切片来完成s := make([]chan int, 0)for i := 0; i < 10; i++ { t := make(chan int) s = append(s, t) n := i go func() { t <- n }()}rand.Seed(time.Now().UnixNano())for _, v := range s { k := 1+rand.Int63n(6) time.Sleep(time.Duration(k) * tim

2020-10-19 14:31:35 1541

原创 golang协程注意全局变量和局部变量

我们会经常性的使用如下片段for k, v := range sli { go ...}来看下面的例子func main() { sli := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} wg := sync.WaitGroup{} for k, v := range sli { wg.Add(1) go func() { time.Sleep(time.Second) fmt.Println(k, v) wg.Done() }() }

2020-10-19 09:30:33 5443 1

原创 golang下载m3u8格式电视剧,调用ffmpeg程序将ts文件合成mp4

linux安装ffmpeg详细教程https://blog.csdn.net/raoxiaoya/article/details/109130549视频来源: u5影视顺序1、下载m3u82、根据m3u8下载ts3、将ts合成mp4下载程序 download.gopackage mainimport ( "fmt" "io" "io/ioutil" "net/http" "os" "regexp")var fileChan chan stringvar endChan

2020-10-18 12:55:41 7965

原创 linux下使用ffmpeg将ts文件合成mp4文件

首先要安装ffmpeghttps://blog.csdn.net/raoxiaoya/article/details/109130549ffmpeg -version合成命令cd /data/www/mvll-rwxrwxrwx. 1 root root 2196216 十月 17 01:44 segment-1-v1-a1.ts-rwxrwxrwx. 1 root root 2972280 十月 17 01:44 segment-2-v1-a1.tsffmpeg -i "concat:

2020-10-17 12:25:45 2292

原创 查看当前计算机CPU架构

1、cat /proc/versionLinux version 3.10.0-1127.10.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Wed Jun 3 14:28:03 UTC 20202、uname -aLinux localhost.localdomain 3.10.0-1127.10.1.el7.x86_6

2020-10-17 11:25:53 7232 2

原创 linux安装ffmpeg详细教程

ffmpeg的官网地址是:https://www.ffmpeg.org/ffmpeg的Github项目地址是:https://github.com/FFmpeg/FFmpeghttps://github.com/FFmpeg/FFmpeg/releaseshttps://github.com/FFmpeg/FFmpeg/archive/n4.3.1.tar.gz下载地址:http://ffmpeg.org/download.html#build-linux此处下载是编译好的二进制可执行文件。

2020-10-17 11:23:41 5410

原创 golang中的随机数rand

随机数从资源生成。包水平的函数都使用的默认的公共资源。该资源会在程序每次运行时都产生确定的序列。如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多go程并发。关于种子seed程序启动的时候,种子的初始值是一样的,也就是说随机数是一样的,什么意思呢?package mainimport ( "fmt" "math/rand")func main(){ data := rand.Int63n(100) fmt.Println(data

2020-10-15 17:10:22 19204 3

原创 golang中的MD5哈希算法

golang中的MD5是由 crypto/md5 包来提供的。md5 包导出两个方法func New() hash.Hashfunc Sum(data []byte) [Size]byteSize 为16,意味着返回的加密结果为长度是16个字节的数组,即128位的二进制数,每一个字节可以由2个16进制的字符来表示,于是 md5 的结果一般是由32位的16进制字符来表示(0-9,a-f)。1、简单的md5re := md5.Sum([]byte("123456")) fmt.Printf("%

2020-10-15 10:55:01 10054

原创 golang中的时间之间的转换

golang的时间转换基本都围绕这 Time 类型,所以,首先要得到 Time 对象,再说去转换成别的格式。time 包下得到 Time 对象的方法func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Timefunc Now() Timefunc Parse(layout, value string) (Time, error)func ParseInLocation(layout, valu

2020-10-14 11:00:56 3948

原创 安装golang开发环境,vscode

官网 https://golang.google.cn/dl/cd /data/www wget https://golang.google.cn/dl/go1.14.7.linux-amd64.tar.gz// 解压并安装到 /usr/localtar -C /usr/local -xzf go1.14.7.linux-amd64.tar.gzmkdir golang 添加环境变量,开启go mod 包管理模式vi /etc/profile# go安装怒路export GORO

2020-10-13 17:36:44 2075

原创 golang发起GET和POST请求,超时设置

GET请求func CurlGetWithParam(link string, param map[string]interface{}) (response string, err error) { u, _ := url.Parse(link) q := u.Query() for k, v := range param { var val string switch ins := v.(type) { case string: val = ins case int:

2020-10-13 14:47:52 9110

原创 gorm如何巧妙的定义model模型

在接口开发中,很多时候返回的数据是基于一个数据表的,但是又不仅限与该表的字段,由于golang是强类型的语言,于是这个model就显得不好设计了。比如想要返回类似于这样的数据:{ "code": 0, "data": { "id": 0, "name": "TP-01", "votestart": 1599580800000, "voteend": 1606751999000, "start_url": ""

2020-10-12 15:04:02 6661

原创 golang中获取字符串长度与遍历的方法

package mainimport ( "bytes" "fmt" "strings" "unicode/utf8")func main() { str := "wo中国\n" // Count counts the number of non-overlapping instances of substr in s. // If substr is an empty string, Count returns 1 + the number of Unicode code poi

2020-10-12 14:22:36 1342

原创 golang调用外部程序,创建进程,fork,守护进程,shell命令,fd查看,lsof

一、syscall.Exec()函数原型func Exec(argv0 string, argv []string, envv []string) (err error)函数说明Exec invokes the execve(2) system call.此方法会将在当前进程空间里,用新的程序覆盖掉当前程序,并执行新的程序,它们依然在同一个进程里,只是进程的内容发生了变化。main11.gopackage mainimport ( "fmt" "syscall")func mai

2020-10-11 17:45:06 18158 1

原创 linux下安装mysql57

cd /mydata/datawget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gztar xzf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysqlmkdir /usr/local/mysql/data查看mysq

2020-10-11 11:02:21 609

原创 golang接口IP限流,IP黑名单,IP白名单

增加中间件可以选择普通模式和LUA脚本模式,建议选择普通模式,实际上不需要控制的那么精确。package Middlewaresimport ( "github.com/gin-gonic/gin" "strconv" "time" "voteapi/pkg/app/response" "voteapi/pkg/gredis" "voteapi/pkg/util")const IP_LIMIT_NUM_KEY = "ipLimit:ipLimitNum"const IP_BLAC

2020-10-10 15:17:24 6654

原创 golang接口解决跨域问题

通过设置响应头,允许跨域请求的方式来解决。首先编写设置响应头的中间件package Corsimport ( "net/http" "github.com/gin-gonic/gin")type Options struct { Origin string}func CORS(options Options) gin.HandlerFunc { return func(c *gin.Context) { if options.Origin != "" { c.Writ

2020-10-10 14:51:08 2462

原创 golang如何优雅的表示2的10次方-位运算符

位运算符对整数在内存中的二进制位进行操作。假定 A 为60,B 为13按位与运算符 &其功能是参与运算的两数各对应的二进位相与。同时为1则结果为1,否则为0。(A & B) 结果为 12, 二进制为 0000 1100按位或运算符 |其功能是参与运算的两数各对应的二进位相或,同时为0则结果为0,否则为1.(A | B) 结果为 61, 二进制为 0011 1101按位异或运算符 ^其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1,否则为0。(A

2020-10-10 14:27:13 5237

原创 golang格式化字符串输出左右对齐

使用 fmt.Printf 方法默认右对齐,且采用空格填充func main() { fmt.Printf("%20s %d\n", "women", 12) fmt.Printf("%20s %d\n", "womenxxxxxxxxx", 12333)}设置左对齐,只需要加一个负号func main() { fmt.Printf("%-20s %d\n", "women", 12) fmt.Printf("%-20s %d\n", "womenxxxxxxxxx", 12333)

2020-10-09 17:36:11 12246 2

原创 golang中的JWT

JWT是一种协议,和语言无关,只需要按照协议来加密和解析即可,但是golang是强类型的,所以自定义的claims中的各字段要正确定义,否则无法解析。首先需要设置加密算法(比如 HS256)和 JWT Secret。当拿到一个JWT Token之后可以先Debug查看其三个部分的定义。关于JWT的原理可以参考 https://blog.csdn.net/raoxiaoya/article/details/101781339也就是说,通过JWT Token 就可以知道算法(第一部分)和claims(

2020-10-09 17:14:16 758

原创 golang生成base64格式的图形验证码

依赖的包go get -u github.com/mojocn/base64Captcha文档地址https://mojotv.cn/go/refactor-base64-captchaDEMO展示地址,按F12查看参数及返回信息https://captcha.mojotv.cn/刚开始运行的时候出现报错invalid memory address or nil pointer dereference goroutinethe demo main.go must run with the

2020-10-09 16:45:57 5024 7

原创 golang的睡眠函数 time.Sleep(1) 和 time.Sleep(time.Second * 1) 的区别

time.Sleep(1) 和 time.Sleep(time.Second * 1) 是不一样的。示例for i := 0; i < 10; i++ { fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "job 1111") time.Sleep(time.Second * 1) // 正常}2020-09-18 17:17:00 job 11112020-09-18 17:17:01 job 11112020-09-18

2020-10-09 16:10:40 9317 1

原创 golang中的定时任务

定时任务 robfig/crongo get github.com/robfig/cron/v3@v3.0.0https://github.com/robfig/cronhttps://godoc.org/github.com/robfig/cron注意:v3开始执行策略为5个参数,不是6个,实际上秒级的定时任务也没有存在的意义。robfig/cron 是一个常驻内存的进程,通过多个协程内部的定时器来来实现定时任务,因此需要考虑一下几个问题。1、如果一个任务的执行时间超过了频率时间会怎样因为

2020-10-09 16:00:18 2008

原创 golang 内置函数built-in

close用于管道通信,关闭chanal。len,caplen 用于返回某个类型的长度或数量(字符串、数组、切片、map 、管道);cap用于返回某个类型的最大容量(只能用于切片和 map)。new,makenew 和 make 均是用于分配内存;new 用于值类型和用户定义的类型,如自定义结构,make 用于内置引用类型(切片、map 和管道)。它们的用法就像是函数,但是将类型作为参数:new(type)、make(type)。new(T) 分配类型 T 的零值并返回其地址,也就是指向类型

2020-10-09 15:04:04 721

原创 PHPExcel设置数据格式,数据类型的几种方法

问题1:PHPExcel 长数字串显示为科学计数。在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号。问题2:输入类似于 0123 的数据到单元格,会被替换为 123 。为了解决以上的问题,需要设置的单元格的数据类型为字符串。方法1、设置单元格为文本$objPHPExcel = new PHPExcel();$objPHPExcel->setActiveSheetIndex(0);$objP

2020-10-09 09:44:17 3142

空空如也

空空如也

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

TA关注的人

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