为您找到搜索结果:3305个
Go语言入门 不错
部落图鉴之Go:爹好还这么努力?安装下载源码编译安装下载相应平台的安装包安装 下载地址:https://golang.org/dl/Linux上的apt-get,yum,Mac上的homebrew 安装安装完成后命令行输入go,如果显示帮助信息则安装成功GOPATHGOPATH:用来存放用户的Go源码,Go的可运行文件,以及相应的编译之后的包文件src存放源代码,使用goget下载的代码会放到这个目录pkg编译后生成的文件(比如:.a)bin编译后生成的可执行文件go命令和常用工具image.pnggoinstall:编译并把编译好的结果移到$GOPATH/pkg或者$GOPATH/bingobuild:编译(项目和文件)常用参数:-o指定输出的文件名,可以带上路径,例如gobuild-ooutmain.go-i安装相应的包,编译+goinstall-v打印出来我们正在编译的包名goget:安装第三方包常用命令:-d只下载不安装-u强制使用网络去更新包和它的依赖包-v显示执行的命令goclean:移除当前源码包和关联源码包里面编译生成的文件gofmt:格式化代码go...
Go语言 异常panic和恢复recover用法
背景:Go语言追求简洁优雅,所以,Go语言不支持传统的try…catch…finally这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,才使用Go中引入的Exception处理:defer,panic,recover。panic:1、内建函数2、假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行3、返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行,这里的defer有点类似try-catch-finally中的finally4、直到goroutine整个退出,并报告错误recover:1、内建函数2、用来控制一个goroutine的panicking行为,捕获panic,从而影响应用的行为3、一...
go语言的defer语句
go语言defer语句的用法defer后面必须是函数调用语句,不能是其他语句,否则编译器会出错。packagemainimport"log"funcfoo(nint)int{defern++//deferlog.Println("n=",n)returnn}funcmain(){variint=100foo(i)}这个例子中defer后面使用的是n++指令,不是一个函数调用语句,编译器就报错:#command-line-arguments./main.go:6:expressionindefermustbefunctioncall./main.go:6:syntaxerror:unexpected++atendofstatementdefer后面的函数在defer语句所在的函数执行结束的时候会被调用;我们查看一下汇编吗,看看defer是在什么时候被执行的:定义两个函数foo1和foo2,功能和代码都是一样,只是其中一个包含defer语句,另一个没有。funcfoo1(iint)int{i=100i=200returni}funcfoo2(iint)int{i=100deferfoo()...
深度解密Go语言之 pprof
目录什么是pprofpprof的作用pprof如何使用runtime/pprofnet/http/pprofpprof进阶RussCox实战查找内存泄露总结参考资料相信很多人都听过“雷神3”关于性能优化的故事。在一个3D游戏引擎的源码里,JohnCarmack将 1/sqrt(x) 这个函数的执行效率优化到了极致。一般我们使用二分法,或者牛顿迭代法计算一个浮点数的平方根。但在这个函数里,作者使用了一个“魔数”,根本没有迭代,两步就直接算出了平方根。令人叹为观止!因为它是最底层的函数,而游戏里涉及到大量的这种运算,使得在运算资源极其紧张的DOS时代,游戏也可以流畅地运行。这就是性能优化的魅力!工作中,当业务量比较小的时候,用的机器也少,体会不到性能优化带来的收益。而当一个业务使用了几千台机器的时候,性能优化20%,那就能省下几百台机器,一年能省几百万。省下来的这些钱,给员工发年终奖,那得多Happy!一般而言,性能分析可以从三个层次来考虑:应用层、系统层、代码层。应用层主要是梳理业务方的使用方式,让他们更合理地使用,在满...
映客直播软开校招岗(go语言)
问题:笔试:比较简单,有一道题比较深刻:内存1G,需要计算1G的数据排序,哪种排序方法效率最低,当时选的是冒泡,因为涉及到频繁的数据交换,其实应该是归并,因为归并不是原地排序,多占用的内存空间,会与磁盘进行频繁的页交换,造成卡顿。面试:实习的感受学校的经历手写二分法手写图手写图的广度优先算法手写图的深度优先算法总结:校招的岗位jd要求不是很高,熟悉java的同学也可以去投go没有通过,深度优先没写出来,广度写的也不是很流畅,图方面的知识看的太少了,从此以后不熟的知识点绝对不会往简历上写。...
Go语言并发编程总结
Golang:不要通过共享内存来通信,而应该通过通信来共享内存。这句风靡在Go社区的话,说的就是goroutine中的channel.......他在go并发编程中充当着类型安全的管道作用。1、通过golang中的goroutine与sync.Mutex进行并发同步import( "fmt" "sync" "runtime")varcountint=0;funccounter(lock*sync.Mutex){ lock.Lock() count++ fmt.Println(count) lock.Unlock()}funcmain(){ lock:=&sync.Mutex{} fori:=0;i<10;i++{ &n...
Mac下安装与配置Go语言开发环境
安装gobrewinstallgo如果提示-bash:brew:commandnotfound,可以看这:https://www.cnblogs.com/sea-stream/p/10309985.html安装完毕,一般安装好go之后,使用goenv查看一下当前环境。此时显示出来的GOROOT就是你使用brew安装go的安装目录,这个路径要记下来MacdeMacBook-Pro:~macname$goenvGOARCH="amd64"GOBIN=""GOCACHE="/Users/macname/Library/Caches/go-build"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="darwin"GOOS="darwin"GOPATH="/Users/macname/go"GOPROXY=""GORACE=""GOROOT="/usr/local/Cellar/go/1.11.4/libexec"GOTMPDIR=""GOTOOLDIR="/usr/local/Cellar/go/1.11.4/libexec/pkg/to...
go语言 变量类型
packagemainimport"fmt"funcmain(){//这是我们使用range去求一个slice的和。使用数组跟这个很类似。创建数组nums:=[]int{2,3,4}sum:=0for_,num:=rangenums{sum+=num}fmt.Println("sum:",sum)//在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。输出数组fori,num:=rangenums{ifnum==3{fmt.Println("index:",i)}}//range也可以用在map的键值对上。输出字典kvs:=map[string]string{"a":"apple","b":"banana"}fork,v:=rangekvs{fmt.Printf("%s->%s",k,v)}//range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。输出字符串fori,c:=range"go"{fmt.Print...
在Go语言项目中使用Zap日志库
在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能:能够将事件记录到文件中,而不是应用程序控制台。日志切割-能够根据文件大小、时间或间隔等来切割日志文件。支持不同的日志级别。例如INFO,DEBUG,ERROR等。能够打印基本信息,如调用文件/函数名和行号,日志时间等。在介绍Uber-go的zap包之前,让我们先看看Go语言提供的基本日志功能。Go语言提供的默认日志包是https://golang.org/pkg/log/。实现GoLogger实现一个Go语言中的日志记录器非常简单——创建一个新的日志文件,然后设置它为日志的输出位置。设置Logger我们可以像下面的代码一样设置日志记录器funcSetupLogger(){logFileLocation,_:=os.OpenFile("/Users/q1mi/test.log",os.O_CREATE|os.O_APPEND|os.O_RDWR,0744)log.SetOutput(logFileLocation)} 使用Logger让我们来写一些虚拟的代码来使用这个日志记录器。在当前的示例中...
Go语言标准库flag基本使用
文章引用自 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。packagemainimport("fmt""os")//os.Argsdemofuncmain(){//os.Args是一个[]stringiflen(os.Args)>0{forindex,arg:=rangeos.Args{fmt.Printf("args[%d]=%v",index,arg)}}} 将上面的代码执行gobuild-o"args_demo"编译之后,执行:$./args_demoabcdargs[0]=./args_demoargs[1]=aargs[2]=bargs[3]=cargs[4]=d os.Args是一个存储命令行参数的字符串切片,它的第一个元素是执行文件的名称。本文介绍了flag包的常用函数和基本用法,更详细的内容请查看官方文档。importflagflag包支持的命令行参数类型有bool、int、int64、uint、uint64、floatfloat64、string、duration。flag参数有效值字符串flag...
Go语言之依赖管理
最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?Go语言从v1.5开始开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等。godep是一个通过vender模式实现的Go语言的第三方依赖管理工具,类似的还有由社区维护准官方包管理工具dep。安装执行以下命令安装godep工具。$gogetgithub.com/tools/godep基本命令安装好godep之后,在终端输入godep查看支持的所有命令。godepsave将依赖项输出并复制到Godeps.json文件中godepgo使用保存的依赖项运行go工具godepget下载并安装具有指定依赖项的包godeppath打印依赖的GOPATH路径godeprestore在GOPATH中拉取依赖的版本godepupdate更新选定的包或go版本godepdiff显示当前和以前保存的依赖项集之间的差异godepversion查看版本信息使用god...
Go语言操作mongoDB
mongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。mongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。mongoDB中将一条数据存储为一个文档(document),数据结构由键值(key-value)对组成。其中文档类似于我们平常编程中用到的JSON对象。文档中的字段值可以包含其他文档,数组及文档数组。mongoDB相关概念mongoDB中相关概念与我们熟悉的SQL概念对比如下:MongoDB术语/概念说明对比SQL术语/概念database数据库databasecollection集合tabledocument文档rowfield字段columnindexindex索引primarykey主键MongoDB自动将_id字段设置为主键primarykey我们这里下载和安装社区版,官网下载地址。打开上述连接后,选择对应的版本、...
Go语言操作Redis
Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。Redis支持诸如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、带范围查询的排序集合(sortedsets)、位图(bitmaps)、hyperloglogs、带半径查询和流的地理空间索引等数据结构(geospatialindexes)。缓存系统,减轻主数据库(MySQL)的压力。计数场景,比如微博、抖音中的关注数和粉丝数。热门排行榜,需要排序的场景特别适合使用ZSET。利用LIST可以实现队列的功能。这里直接使用Docker启动一个redis环境,方便学习使用。docker启动一个名为redis507的5.0.7版本的redisserver示例:dockerrun--nameredis507-p6379:6379-dredis:5.0.7 注意:此处的版本、容...
Go语言标准库之http/template
在一些前后端不分离的Web架构中,我们通常需要在后端将一些数据渲染到HTML文档中,从而实现动态的网页(网页的布局和样式大致一样,但展示的内容并不一样)效果。我们这里说的模板可以理解为事先定义好的HTML文档文件,模板渲染的作用机制可以简单理解为文本替换操作–使用相应的数据去替换HTML文档中事先准备好的标记。很多编程语言的Web框架中都使用各种模板引擎,比如Python语言中Flask框架中使用的jinja2模板引擎。Go语言内置了文本模板引擎text/template和用于HTML文档的html/template。它们的作用机制可以简单归纳如下:模板文件通常定义为.tmpl和.tpl为后缀(也可以使用其他的后缀),必须使用UTF8编码。模板文件中使用{{和}}包裹和标识需要传入的数据。传给模板这样的数据就可以通过点号(.)来访问,如果数据是复杂类型的数据,可以通过{{.FieldName}}来访问它的字段。除{{和}}包裹的内容外,其他内容均不做修改原样输出。Go语言模板引擎的使用可以分为三部分:定义模板文件、解析模板文件和模板渲染....
Go语言基础之net/http
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。Go语言内置的net/http包提供了HTTP客户端和服务端的实现。HTTP协议超文本传输协议(HTTP,HyperTextTransferProtocol)是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。基本的HTTP/HTTPS请求Get、Head、Post和PostForm函数发出HTTP/HTTPS请求。resp,err:=http.Get("http://example.com/")...resp,err:=http.Post("http://example.com/upload","image/jpeg",&buf)...resp,err:=http.PostForm("http://example.com/form",url.Values{"key":{"Value"},"id":{"123"}}) 程序在使用完response后必须关闭回复的主体。resp,err...