202102-21 详解go-admin在线开发平台学习(安装、配置、启动) 项目介绍go-admin是一个中后台管理系统,基于(gin,gorm,Casbin,Vue,ElementUI)实现。主要目的是为了让开发者更专注业务,减少重复代码的编写,节省时间,提升人效,缩短项目周期,提升软件的开发效率以及质量。下载项目gitclonehttps://github.com/go-admin-team/go-admin.git使用git下载go-admin项目,作为一个程序员,如果说你不会使用git,那就有点说不过去了吧本地环境准备项目采用前后端分离的方式,后端基于golang... 继续阅读 >
202102-20 go语言中的Carbon库时间处理技巧 go语言之Carbon库carbon是一个时间扩展库,它提供了易于使用接口。简单示例:packagemainimport("fmt""github.com/uniplaces/carbon""time")funcmain(){//打印当前时间now:=carbon.Now().DateTimeString()fmt.Println("本地时间:",now)Japantoday,_:=carbon.NowInLocation("Japan")fmt.Println("日本时间:",Japantoday)//明天tomorrow:=carbon.Now().AddDay()fmt.Println(tomorrow)//上周的今天su... 继续阅读 >
202101-27 一文秒懂Go 编写命令行工具的代码 前言最近因为项目需要写了一段时间的Go,相对于Java来说语法简单同时又有着一些Python之类的语法糖,让人大呼”真香“。但现阶段相对来说还是Python写的多一些,偶尔还得回炉写点Java;自然对Go也谈不上多熟悉。于是便利用周末时间自己做个小项目来加深一些使用经验。于是我便想到了之前利用Java写的一个博客小工具。那段时间正值微博图床大量图片禁止外链,导致许多个人博客中的图片都不能查看。这个工具可以将文章... 继续阅读 >
202101-24 Go中time.RFC3339 时间格式化的实现 在开发过程中,我们有时会遇到这样的问题,将2020-11-08T08:18:46+08:00转成2020-11-0808:18:46,怎么解决这个问题?解决这个问题,最好不要用字符串截取,或者说字符串截取是最笨的方法,这应该是时间格式化的问题。我们先看一下golangtime包中支持的format格式:const(ANSIC="MonJan_215:04:052006"UnixDate="MonJan_215:04:05MST2006"RubyDate="MonJan0215:04:05-07002006"RFC822="... 继续阅读 >
202101-21 Go基于GORM 获取当前请求所执行的 SQL 信息(思路详解) 前言为了便于精准排查问题,需要将当前的请求信息与当前执行的SQL信息设置对应关系记录下来,记录的SQL信息包括:执行SQL的当前时间;执行SQL的文件地址和行号;执行SQL的花费时长;执行SQL的影响行数;执行的SQL语句;数据库组件使用的是GORM。思路1、在执行SQL前,设置开始执行时间(计算执行时长会用到);2、在执行SQL后,第一,获取当前请求的上下文,为什么获取上下文,因为需要从上下文中获取... 继续阅读 >
202101-17 go实现冒泡排序的示例代码 冒泡排序:(BubbleSorting)基本思想是通过对待排序序列从后向前(从下标较大的元素开始)以此比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后补移向前部(从下标较大的单元移向单位较小的单元),就像水底的气泡一样逐渐向上冒。因为排序的过程中,各元素不断的接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的... 继续阅读 >
202101-13 Go http client 连接池不复用的问题 当httpclient返回值为不为空,只读取responseheader,但不读body内容就执行response.Body.Close(),那么连接会被主动关闭,得不到复用。测试代码如下://xiaorui.ccfuncHttpGet(){for{fmt.Println("new")resp,err:=http.Get("http://www.baidu.com")iferr!=nil{fmt.Println(err)continue}ifresp.StatusCode==http.StatusOK{continue}resp.Body.Close()fmt.Println("gonum",runtime.N... 继续阅读 >
202101-10 Go 自定义error错误的处理方法 Go的error比较灵活.但是自身对error处理的机制有不太好用,我们可以自定义错误输出:只要所有实现了Error()方法的对象都可以,这里给个比较简单的demo,后续整理一个error的优化封装:packagemainimport("fmt")typeNameEmtpyErrorstruct{namestring}//NameEmtpyError实现了Error()方法的对象都可以func(e*NameEmtpyError)Error()string{return"name不能为空"}funcNameCheck(namestring)(bool,error){ifname=... 继续阅读 >
202012-24 go 判断两个 slice/struct/map 是否相等的实例 可以通过reflect.DeepEqual比较两个slice/struct/map是否相等:packagemainimport("fmt""reflect")typeAstruct{sstring}funcmain(){a1:=A{s:"abc"}a2:=A{s:"abc"}ifreflect.DeepEqual(a1,a2){fmt.Println(a1,"==",a2)}b1:=[]int{1,2}b2:=[]int{1,2}ifreflect.DeepEqual(b1,b2){fmt.Println(b1,"==",b2)}c1:=map[string]int{"a":1,"b":2}c2:=map[string]int{"a":1... 继续阅读 >
202012-24 Go语言获取系统性能数据gopsutil库的操作 psutil是一个跨平台进程和系统监控的Python库,而gopsutil是其Go语言版本的实现。本文介绍了它的基本使用。Go语言部署简单、性能好的特点非常适合做一些诸如采集系统信息和监控的服务,本文介绍的gopsutil库是知名Python库:psutil的一个Go语言版本的实现。一、安装gogetgithub.com/shirou/gopsutil二、使用2.1CPU采集CPU相关信息。import"github.com/shirou/gopsutil/cpu"//cpuinfofuncgetCpuInfo(){cpuInfos,... 继续阅读 >
202012-24 Go语言设置JSON的默认值操作 给需要设置的JSON字段初试化你想设置的值就OK。比如我想让[]string类型的字段的默认值是[],而不是nil,那我就make([]string,0)赋值给该字段。转成JSON输出后,就是[]。1.示例代码这是没有初始化的代码。默认值是nil。packagemainimport("encoding/json""fmt""net""net/http")typeJsonTeststruct{Test1string`json:"test1"`Test2[]string`json:"test2"`}//定义自己的路由器typeMyMux1struct{}//实现http.... 继续阅读 >
202012-24 使用Go module和GoLand初始化一个Go项目的方法 1简介Golang是一门优秀的语言,特别是在并发编程上,得益于它的协程和channel等,非常方便易用。它通过gomodule来管理包和依赖,本文介绍如何利用它创建一个项目。2重要的环境变量Go通过环境变量来做项目上的管理和控制,通过命令goenv可以查看相关变量:$goenvGO111MODULE="on"GOARCH="amd64"GOHOSTOS="darwin"GOMODCACHE="/Users/larry/go/pkg/mod"GOPATH="/Users/larry/go"GOPROXY="https://mirrors.aliyun.com/g... 继续阅读 >
202012-24 go 迭代string数组操作 go for string[] go迭代string数组,直接拷贝去用即可packagemainimport("fmt")funcmain(){subsCodes:=[]string{"aaaa","vvvvv","dddd","eeeee","gfgggg"}for_,s:=rangesubsCodes{fmt.Println(s)}}补充:golang字符串string与字符数组[]byte高效转换string与[]byte的直接转换是通过底层数据copy实现的vara=[]byte("helloboy")varb=string(a)这种操作在并发量达到十万百万级别的时候会拖慢程序的处理速度通过gdb调... 继续阅读 >
202012-24 使用go的interface案例实现多态范式操作 看程序:packagemainimport"fmt"typeBaseIntfinterface{Process()}typeMsg1struct{reqintrspint}func(p*Msg1)Process(){fmt.Println("process1")}typeMsg2struct{reqintrspint}func(p*Msg2)Process(){fmt.Println("process2")}funcmain(){m1:=new(Msg1)m1.Process()m2:=new(Msg2)m2.Process()}变一下:packagemainimport"fmt"typeBaseIntfinterface{Process()}funcRu... 继续阅读 >
202012-23 Go 修改map slice array元素值操作 在“range”语句中生成的数据的值其实是集合元素的拷贝。它们不是原有元素的引用。这就意味着更新这些值将不会修改原来的数据。我们来直接看段示例:packagemainimport"fmt"funcmain(){data:=[]int{1,2,3}for_,v:=rangedata{v*=10//原始元素未更改}fmt.Println("data:",data)//输出data:[123]}如果我们需要更新原有集合中的数据,使用索引操作符来获得数据即可:packagemainimport"fmt"funcmain(... 继续阅读 >
202012-23 go 读取BMP文件头二进制读取方式 BMP文件头定义:WORD两个字节16bitDWORD四个字节32bitpackagemainimport("encoding/binary""fmt""os")funcmain(){file,err:=os.Open("tim.bmp")iferr!=nil{fmt.Println(err)return}deferfile.Close()//type拆成两个byte来读varheadA,headBbyte//Read第二个参数字节序一般windows/linux大部分都是LittleEndian,苹果系统用BigEndianbinary.Read(file,binary.LittleEndian,&headA)binary.Re... 继续阅读 >