202106-08 golang elasticsearch Client的使用详解 elasticsearch的client,通过NewClient建立连接,通过NewClient中的Set.URL设置访问的地址,SetSniff设置集群获得连接后,通过Index方法插入数据,插入后可以通过Get方法获得数据(最后的测试用例中会使用elasticsearchclient的Get方法)funcSave(iteminterface{}){client,err:=elastic.NewClient(elastic.SetURL("http://192.168.174.128:9200/"),//Mustturnoffsniffindockerelastic.SetSn... 继续阅读 >
202106-08 Golang的func参数及返回值操作 参数及返回值参数一指定数据类型为int参数二(…interface{})可传任何多个不同类型的参数返回值:单个返回值直接指定数据类型可以不使用(),多个返回值需使用()。各返回值之间使用逗号分隔funcmain(){demo.Params(10,20,"golang",true)}funcParams(idint,params...interface{})(error,error){fmt.Println(id)fmt.Println(params[0])fmt.Println(params[1])fmt.Println(params[2])forkey,val:=rangeparams... 继续阅读 >
202106-07 golang 比较浮点数的大小方式 Golang浮点数比较和运算会出现误差。浮点数储存至内存中时,2的-1、-2……-n次方不能精确的表示小数部分,所以再把这个数从地址中取出来进行计算就出现了偏差。packagemainimport("errors""fmt""github.com/shopspring/decimal")funcFloatCompare(f1,f2interface{})(nint,errerror){varf1Dec,f2Decdecimal.Decimalswitchf1.(type){casefloat64:f1Dec=decimal.NewFromFloat(f1.(float64))switchf2.(ty... 继续阅读 >
202106-07 解决Golang中goroutine执行速度的问题 突然想到了之前一直没留意的for循环中开goroutine的执行顺序问题,就找了段代码试了试,试了几次后发现几个有意思的地方,我暂时没有精力往更深处挖掘,希望有golang大神能简单说一说这几个地方是怎么回事。代码:packagemainimport"fmt"funcCount(chchanint){fmt.Println("Countdoing")ch<-1fmt.Println("Counting")}funcmain(){chs:=make([]chanint,100)fori:=0;i<100;i++{chs[i]=make(c... 继续阅读 >
202106-07 解决golang结构体tag编译错误的问题 写了一个带标签的结构体typeserverstruct{XMLNamexml.Name'xml:"server"'}解决编译错误fieldtagmustbeastring,后来发现是后面标签上引号不正确,不应该是回车键旁边的单引号,而是数字键1旁边的单引号typeserverstruct{XMLNamexml.Name`xml:"server"`}补充:golang中struct成员变量的标签(Tag)说明和获取方式在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内... 继续阅读 >
202106-07 golang 实现Location跳转方式 golang作为互联网时代的C语言,对网络的支持是非常友好的,最近想做个短网址转发使用,自然想到用Golang开发。闲话少说,直接上源码:packagemainimport("fmt""log""net/http")funclogin(whttp.ResponseWriter,r*http.Request){fmt.Print(fmt.Sprintf("%v+",r))w.Header().Set("Cache-Control","must-revalidate,no-store")w.Header().Set("Content-Type","text/html;charset=UTF-8")w.Header().Set("Locatio... 继续阅读 >
202106-07 解决golang post文件时Content-Type出现的问题 同事用php写了一个接口,要上传文件,让我做下测试,直接用curl命令调用成功,然后想用golang写个示例,源码如下:packagemainimport("bytes""fmt""io/ioutil""mime/multipart""net/http")funcmain(){uri:="http://xxxxxxxxxxxx/api/fileattr"//URL地址xxxxxxxxxxxx由商务提供name:="xxxxxxxxxxxx"//用户名pass:="xxxxxxxxxxxx"//密码fn:="xxxxxxxxxxxx.txt"//文... 继续阅读 >
202106-07 对Golang中的FORM相关字段理解 Form字段通过调用Request结构体提供的方法,我们可以将URL、Body、或者以上两者的数据提取到该结构体的Form、PostForm和MultipartForm等字段中。(1)调用ParseForm方法或者ParseMultipartForm方法,对请求进行分析(2)访问相应的字段事例:packagemainimport("net/http""fmt")funcprocess(whttp.ResponseWriter,r*http.Request){r.ParseForm()//ParseForm对请求进行语法分析fmt.Fprintln(w,r.MultipartForm)}func... 继续阅读 >
202106-07 golang 打印error的堆栈信息操作 众所周知,目前的golangerror只关注Error()信息,而不关注它的堆栈路径,对错误的定位大多数通过log.SetFlags(log.Llongfile|log.LstdFlags)log.Println(e)一旦代码分层,为了定位错误,可能出现每一个层次的同一个error,都得log好几次,比如:funcDB()error{returnerrors.New("timeout")}funcDao()error{ifer:=DB();er!=nil{log.Println(er)returnerror}returnnil}funcService()error{i... 继续阅读 >
202106-07 golang中json和struct的使用说明 1、返回json响应结果在struct的字段后面加入json:"key"可以进行json格式输出,其中key为json的键名typeSuccessResponsestruct{Codeint`json:"code"`Msgstring`json:"msg"`Datainterface{}`json:"data"`}funcSuccessRsp(ctx*gin.Context,datainterface{}){res:=SuccessResponse{Code:0,Msg:"success",Data:data,}ctx.JSON(http.StatusOK,res)}typeMyData... 继续阅读 >
202106-07 golang coroutine 的等待与死锁用法 直接上代码:1.第一种情况如果没有select{},main主线程不会等待coroutine运行,导致coroutine得不到机会运行。Youarerequestingeventualscheduling(usingthetwogostatements)oftwogoroutinesandthenyouexitmainwithoutgivingtheschedulerachancetodoanything.有了select,程序正常运行。packagemainimport("fmt""time")funcmain(){gofunc1()gofunc2()select{}}funcfunc1(){... 继续阅读 >
202106-05 golang DNS服务器的简单实现操作 简单的DNS服务器提供一个简单的可以查询域名和反向查询的DNS服务器。dig命令主要用来从DNS域名服务器查询主机地址信息。查找www.baidu.com的ip(A记录):命令:dig@127.0.0.1www.baidu.com根据ip查找对应域名(PTR记录):命令:dig@127.0.0.1-x220.181.38.150源码:packagemainimport("fmt""net""golang.org/x/net/dns/dnsmessage")funcmain(){conn,err:=net.ListenUDP("udp",&net.UDPAddr{Port:53})if... 继续阅读 >
202106-05 golang slice元素去重操作 合并两个整型切片,返回没有重复元素的切片,有两种去重策略1.通过双重循环来过滤重复元素(时间换空间)//通过两重循环过滤重复元素funcRemoveRepByLoop(slc[]int)[]int{result:=[]int{}//存放结果fori:=rangeslc{flag:=trueforj:=rangeresult{ifslc[i]==result[j]{flag=false//存在重复元素,标识为falsebreak}... 继续阅读 >
202106-05 Golang中interface{}转为数组的操作 interface{}转为普通类型我们都知道在golang中interface{}可以代表任何类型,对于像int64、bool、string等这些简单类型,interface{}类型转为这些简单类型时,直接使用p,ok:=t.(bool)p,ok:=t.(int64)如果ok==true的话,就已经类型转换成功。假设有这样一个场景,我们有一个函数有返回值,但是返回值的类型不定,所以我们的返回值类型只能以接口来代替了。返回接口类型之后,我们就要对其类型进行判断然后进行类型转换。如果... 继续阅读 >
202106-05 golang 实现一个负载均衡案例(随机,轮训) 今天用go实现一个简单的负载均衡的算法,虽然简单,还是要写一下。1.首先就是服务器的信息packagebalancetypeInstancestruct{hoststringportint}funcNewInstance(hoststring,portint)*Instance{return&Instance{host:host,port:port,}}func(p*Instance)GetHost()string{returnp.host}func(p*Instance)GetPort()int{returnp.port}2.接着定义接口packagebalanc... 继续阅读 >
202106-05 golang 实现一个restful微服务的操作 如何用net/http构建一个简单的web服务Golang提供了简洁的方法来构建web服务packagemainimport("net/http")funcHelloResponse(rwhttp.ResponseWriter,request*http.Request){fmt.Fprintf(w,"Helloworld.")}funcmain(){http.HandleFunc("/",HelloResponse)http.ListenAndServe(":3000",nil)}其中核心的两个方法:funcHandleFunc(patternstring,handlerfunc(ResponseWriter,*Request)):HandleF... 继续阅读 >