![](https://img-blog.csdnimg.cn/20201201225639550.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
go
文章平均质量分 51
go语言学习专栏
Achou.Wang
勿在浮沙筑高台
展开
-
线段树segment_tree go语言实现
线段树(segment tree)什么是线段树线段树是一种二叉搜索树,什么叫做二叉搜索树,首先满足二叉树,每个结点度小于等于二,即每个结点最多有两颗子树,何为搜索,我们要知道,线段树的每个结点都存储了一个区间,也可以理解成一个线段,而搜索,就是在这些线段上进行搜索操作得到你想要的答案。线段树是建立在线段的基础上,每个结点都代表了一条线段[a,b]。长度为1的线段称为元线段。非元线段都有两个子结点,左结点代表的线段为[a,(a + b) / 2],右结点代表的线段为[((a + b) / 2)+1,b]原创 2022-03-11 22:29:22 · 791 阅读 · 1 评论 -
Go Embed简明教程
Go Embed简明教程go语言程序都是编译成二进制可执行文件的,但是实际执行时除了需要可执行程序,还需要一些静态文件,比如html模板等,于是就有人想如果Go官方能内建支持就好了。2019末一个提案被提出 issue#35950,期望Go官方编译器支持嵌入静态文件。后来Russ Cox专门写了一个设计文档 Go command support for embedded static assets, 并最终实现了它。需要注意的这个功能在go 1.16beta之后才支持对于单个的文件,支持嵌入为原创 2021-09-26 21:47:00 · 2567 阅读 · 0 评论 -
使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)
使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)使用beep播放mp3文件(10num)使用go语言GUI库fyne实现音乐播放器要是想使用go语言实现播放mp3需要借助beep库,在github上有已经开源的库路径如下:beep库文件路径下面的代码只是实现了简单的播放功能,没有暂停和快进的功能package mainimport ( "github.com/faiface/beep" "github.com/faiface/beep/mp3" "gi原创 2021-08-25 22:25:36 · 2003 阅读 · 0 评论 -
使用go语言GUI库fyne绘制一个交通标志
绘制一个交通标志首先实现一个函数makeSign(),该函数返回fyne.CanvasObject对象,对象中实现所有的图形func makeSign() fyne.CanvasObject { bg := canvas.NewCircle(color.NRGBA{R: 255, A: 255}) bg.StrokeColor = color.White bg.StrokeWidth = 5 bar := canvas.NewRectangle(color.White)原创 2021-08-24 23:28:38 · 602 阅读 · 0 评论 -
golang的GUI库,使用go-fyne设计一个代办事项APP
Designing task list我们在这一节中将会设计一个,左边是列表,右边列表中代办事项的具体内容实现效果如图:实现该需要使用总共用了两个文件,一个task_list.gopackage mainimport ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "ti原创 2021-08-16 23:12:37 · 2117 阅读 · 0 评论 -
使用fyne绘制一个交通图标
fyne绘制一个交通标志首先实现一个函数makeSign(),该函数返回fyne.CanvasObject对象,对象中实现所有的图形func makeSign() fyne.CanvasObject { bg := canvas.NewCircle(color.NRGBA{R: 255, A: 255}) bg.StrokeColor = color.White bg.StrokeWidth = 5 bar := canvas.NewRectangle(color.Whi原创 2021-07-13 23:23:30 · 737 阅读 · 0 评论 -
go语言goroutine的取消
go语言中使用 contex实现goroutine的取消package mainimport ( "context" "fmt" "sync" "time")// context 如何优雅的控制子goroutinevar wg sync.WaitGroupfunc f(ctx context.Context) { defer wg.Done() //整个缩进都会跳出LOOP: for { fmt.Println("child goroutine") time.Sl原创 2021-02-05 23:16:47 · 333 阅读 · 0 评论 -
go性能优化
Go性能优化CPU profile:报告程序CPU使用情况,按照一定频率去采集应用程序CPU和寄存器上面的数据Memory Profile (Heap Profile):报告内存使用情况Block Profiling:报告goroutines不在运行状况情况下,可以用来分析和查找死锁等性能瓶颈Goroutine Profiling:报告goroutine的使用情况,有哪些goroutine它们调用关系是怎样的package mainimport ( "flag" "fmt" "os"原创 2020-12-22 23:27:06 · 397 阅读 · 0 评论 -
go get 命令提示没有权限问题解决
出现一下类似的问题,是因为你安装go是直接将go源码解压进行安装的,需要对解压后的go目录加上可执行权限:go get github.com/google/pprof: copying /tmp/go-build384767642/b001/exe/a.out: open /usr/local/go/bin/pprof: permission denied家可执行权限:#进入到对应目录,执行:sudo chmod -R 777 go/...原创 2020-12-22 00:07:01 · 2747 阅读 · 0 评论 -
go语言中的闭包
闭包闭包是什么?闭包是一个函数,这个函数包含了他外部作用域的变量函数可以作为返回值函数内部查找变量的顺序,先自己内部找,找不到再往外层找如何形成闭包结构内层函数+外层函数局部变量(可以是入参或者定义的局部变量) = 闭包结构如果将一个内层函数作为函数返回值内层函数中又涉及到外层函数的局部变量(自己定义或者外部传进来的参数,都是局部变量)1+2 条件满足后,就会导致该局部变量的声明周期发生改变,外层函数的局部变量不会随着外层函数的借宿而销毁将这种内层函数变量和外层局部变量,统称为闭包结构原创 2020-12-14 22:25:31 · 231 阅读 · 0 评论 -
go语言中goroutine池
创建三个goroutine,创建5个任务,用三个goroutine干5个任务package mainimport ( "fmt" "time")func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Printf("worker:%d start job:%d\n", id, j) time.Sleep(time.Second) fmt.Printf("原创 2020-12-12 20:29:13 · 264 阅读 · 0 评论 -
go语言中的匿名函数
匿名函数:没有名字的函数package mainimport "fmt"func main() { /* 匿名函数: 没有名字的函数 匿名函数,需要在匿名函数尾部加上()直接调用 */ func1() // 匿名函数采用的也是函数名字 ()实现调用 // 匿名函数的实现和调用 func() { fmt.Println("Anonymous call back.") }() // 加上了小括号实现了函数的调用 // 匿名函数的多次调用 func3 := fu原创 2020-12-10 23:51:14 · 375 阅读 · 0 评论 -
go语言中处处可见的for循环
package mainimport ( "fmt" "math")type xPoint struct { name string age int}// 结构体比较大的时候尽量使用指针的类型 进行构造函数// go语言中 构造函数都是以new开头的func newPoint(name string, age int) *xPoint { return &xPoint{ name: name, age: age, }}func main() {原创 2020-12-10 00:22:30 · 152 阅读 · 0 评论 -
go语言中错误的处理和实现自己的错误处理类型
package mainimport ( "errors" "fmt")func main() { /* 错误:在可能出现问题的地方出现问题, 如打开一个文件打开失败是意料之中的事情 异常:在不该出现错误的地方出现错误, 如出现空指针,意料之外的情况 */ //exec.Command("pwd") //exec.Command("ps") //f, err := os.Open("test.txt") //if err != nil { // log.Fatal(er原创 2020-12-10 00:21:00 · 253 阅读 · 0 评论 -
go语言中使用递归函数实现文件目录的遍历
实现思路:使用ioutil.ReadDir将当前文件信息都读取完,并对目录进行遍历,当当前目录遍历时,如果发现某个文件是子文件夹,就使用回调,再对子目录调用ioutil.ReadDir读取所有的文件信息,以此进行实现将当前文件夹下所有的文件进行遍历package mainimport ( "fmt" "io/ioutil" "log")func main() { // listFiles(".", 0)}func listFiles(dirName string, level原创 2020-12-10 00:07:09 · 461 阅读 · 0 评论 -
go语言中的defer
defer的词义: 延迟 推迟在go语言中,使用defer关键字来延迟一个函数或者方法的执行1. defer 函数或方法 一个函数或方法会被延迟执行2. defer的使用A 对象文件的close 临时文件的删除B go语言中关于异常的处理,使用panic 和recoverpanic函数引发的恐慌 导致程序中断执行recover函数用于恢复程序的执行recover()语法上要求必须在defer中执行3. 如果多个defer函数倒序调用 最后defer调用的最先被调用package main原创 2020-12-10 00:00:16 · 511 阅读 · 0 评论 -
go语言中channel的创建和销毁以及匿名函数的使用
channel的创建go语言中,任意类型前面加上关键字chan即可声明对应类型的通道,创建通道需要使用make,make也用于map 和slice的创建创建一个通道/*刚创建的通道是nil*/var a chan boola = make(chan bool)使用匿名函数创建一个goroutinego func() { for i := 1; i < 10; i++ { fmt.Println("子goroutine is running....", i) } // 往通道中原创 2020-12-09 23:58:07 · 955 阅读 · 0 评论 -
go语言buffio与继承
buffio比较简单,主要就是对Io一类的操作,第一个例子中顺带加上了go语言中继承的实现,因为go不是面相对象的语言,更准确的来说是面相接口编程的语言,因此继承的实现其实就是将另外一个结构体合并到自己的结构体中,package mainimport ( "bufio" "fmt" "os")type animal struct { eye int foot int}type dog struct { animal // 对animal实现继承 watch string原创 2020-12-09 23:43:29 · 313 阅读 · 0 评论 -
go语言中变量的定义和使用
Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。声明变量的一般形式是使用 var 关键字:var name type其中,var 是声明变量的关键字,name 是变量名,type 是变量的类型。需要注意的是,Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。这样做的好处就是可以避免像C语言中那样含糊不清的声明形式,原创 2020-12-09 23:26:31 · 820 阅读 · 0 评论 -
go语言数组的使用
go语言的数组除了和C语言的定义时方式不同,使用起来基本上是一样的定义数组://定义一个类型为 [4]int类型的数组var arrName [4]intarrName[0] = 1 // 对数组进行赋值,可以看到,索引还是从0开始的,和C语言保持了一致var arrname2 = [4]int{1, 2, 3, 4} // 创建一个数组并对其进行初始化var b = [5]int{1, 2, 3} // [5]int 类型的数组,只初始化3个值var c = [5]int{1: 1, 3:原创 2020-12-09 23:14:44 · 289 阅读 · 0 评论 -
go语言中结构体与json
go语言中使用Marshal函数实现结构体json化,需要有一下两点注意因为json化是在其他函数中完成,因此需要将结构体中的成员大写,这样才能在生成的结构体中有对应的元素在结构体后面,如果有需要改写字段名称,需要使用烦引号,指定对应的字段名称,支持多指定如json:"name" db:"dbname",这样在不同函数调用的时候,就会生成不同的键值对package mainimport ( "encoding/json" "fmt")// json -- struct// 注原创 2020-12-07 00:09:26 · 1268 阅读 · 0 评论 -
go语言游戏编程-Ebiten使用矩阵实现对图的缩放和移动
如何使用矩阵绘图这个程序几乎和渲染一个图片一模一样,唯一一点不同的是,增加了option参数,并依靠参数,实现了对图像的放大和移动package mainimport ( "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/ebitenutil" _ "image/png" "log")var mImg *ebiten.Imagefunc init() { var err error mImg, _, e原创 2020-12-04 00:32:58 · 525 阅读 · 0 评论 -
go语言游戏编程-Ebiten渲染一张图片
渲染一个图片完整实现代码:package mainimport ( "fmt" "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/ebitenutil" _ "image/png" "log")var img *ebiten.Imagefunc init() { var err error img, _, err = ebitenutil.NewImageFromFile("gopher.png")原创 2020-12-04 00:30:28 · 630 阅读 · 0 评论 -
go语言游戏编程-Ebiten实现画面的填充
Draw完整代码如下:package mainimport ( "github.com/hajimehoshi/ebiten" "image/color" "log")type fGame struct {}func (g *fGame) Update() error { return nil}func (g *fGame) Draw(screen *ebiten.Image) { screen.Fill(color.RGBA{R: 0xff, A: 0xff})}原创 2020-12-02 23:36:33 · 519 阅读 · 0 评论 -
go语言游戏编程初识--`Ebiten`
Ebitenebiten是一个简单的使用纯go实现的游戏,使用这个库即可以实现go语言代码的学习,又可以实现对游戏编程的了解。Hello world让我们以一个Hello world!开始ebiten的学习,完整代码实现如下:package mainimport ( "github.com/hajimehoshi/ebiten" "github.com/hajimehoshi/ebiten/ebitenutil" "log")type Game struct {}func (原创 2020-12-02 23:15:19 · 2131 阅读 · 0 评论 -
Go语言的并发模型
Go语言的并发模型Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序。Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源。接下来我们来了解一下Go语言的并发原理。一、线程模型在现代操作系统中,线程是处理器调度和分配的基本单位,进程则作为资源拥有的基本单位。每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成。线程是进程内部的一个执行单元。 每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建原创 2020-11-01 18:51:05 · 302 阅读 · 0 评论 -
go语言中的闭包结构
每次调用 increment都会重新生成一个闭包结构中的变量内层函数+外层函数局部变量(可以是入参或者定义的局部变量) = 闭包结构如果将一个内层函数作为函数返回值内层函数中又涉及到外层函数的局部变量(自己定义或者外部传进来的参数,都是局部变量)1+2 条件满足后,就会导致该局部变量的声明周期发生改变,外层函数的局部变量不会随着外层函数的借宿而销毁这种内层函数变量和外层局部变量,统称为闭包结构闭包结构中,局部变量的声明周期会发生改变package mainimport "fmt"f原创 2020-10-25 19:53:40 · 256 阅读 · 0 评论 -
go语言中map的使用
一、集合(Map)1.1 什么是Mapmap是Go中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值。Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的,也是引用类型使用map过程中需要注意的几点:map是无序的,每次打印出来的map都会不一样,它不能通过in原创 2020-10-24 09:24:10 · 1150 阅读 · 0 评论 -
go语言中fallthrough与break的使用
fallthrough – 穿透case, 代表者穿透的意思,上一个case匹配成功将紧接着执行fallthrough后面的casebreak – 打断执行package mainimport "fmt"func main() { /* switch 中的break和 fallthrough 语句 switch 语句中默认每个case后面会加上break break可以在switch中也可以在for循环中 */ n := 1 switch n { case 1: fm原创 2020-10-19 23:36:51 · 414 阅读 · 0 评论 -
go语言中及格比较特殊的switch语法
go语言中几种特殊的switch语法package mainimport ( "fmt")func main() { // go语言中switch的特殊用法 // 当没有expr的时候,默认是bool类型,并直接定位到true上 // 即省略 switch后的变量,相当于直接作用在true上 switch { case true: fmt.Println("is true") case false: fmt.Println("si false") } // 使用省略原创 2020-10-19 23:24:42 · 364 阅读 · 0 评论 -
go语言使用规范
编码规范本规范旨在为日常Go项目开发提供一个代码的规范指导,方便团队形成一个统一的代码风格,提高代码的可读性,规范性和统一性。本规范将从命名规范,注释规范,代码风格和 Go 语言提供的常用的工具这几个方面做一个说明。该规范参考了 go 语言官方代码的风格制定。一、 命名规范命名是代码规范中很重要的一部分,统一的命名规则有利于提高的代码的可读性,好的命名仅仅通过命名就可以获取到足够多的信息。Go在命名时以字母a到Z或a到Z或下划线开头,后面跟着零或更多的字母、下划线和数字(0到9)。Go不允许在命名时原创 2020-10-18 15:37:38 · 671 阅读 · 0 评论 -
compile: version “go1.15.3“ does not match go tool version “go1.13.8“
解决办法:这样说吧,你安装go tool之后会在你的/us/bin目录下生成一个执行go 和gofmt的软连接,正是因为这个软连接导致你不能正常找到你安装的go,因为这个如软连接是指向goo tool的。要先想解决这个为需要将这个软连接删除改之前:注意框住的地方,这里就是因为安装go tool导致的新建立的连接,将这个软连接执行你想要执行的go安装路径就行了建立新的软连接之后:之后再执行go version看到已经和自己安装的一致了go version go1.15.3 linux/amd原创 2020-10-17 12:42:02 · 8277 阅读 · 4 评论 -
go语言离线查看说明文档
安装go之后,则可以通过下面简单一行命令运行一个web 服务来查看go 的文档:godoc -http=:9257然后浏览器打开 127.0.0.1:9257原创 2020-10-17 00:27:33 · 747 阅读 · 0 评论 -
各大主流系统go语言安装方式
Go语言的前世今生一、Golang语言的官网首先我们登录Golang的官方网站:https://golang.org/因为Google和中国的关系,直接登录Golang的官网,需要翻墙。当然你也可以登录Golang的国内网站:https://golang.google.cn/二、下载在Mac、Windows和Linux三个平台上都支持Golang。您可以从https://golang.org/dl/下载相应平台的安装包。该网站在国内不容易访问,所以可以访问中国对应的https://g原创 2020-10-16 00:20:25 · 702 阅读 · 0 评论