Go语言中文网 为您找到相关结果 253

用golang写一个简单的游戏(二)

上篇文章写到了,我已经打印出了一个从起点到终点的路径,并且这是受键盘事件控制的。今天我会继续给这个游戏添加一些东西,让它看起来像个“游戏”。 现在我要加上一个障碍,不是随便一条路径都可以从起点到终点,这个障碍就姑且叫它“炸弹”,我赋给它的规则是,它的上下左右(称之为陷阱)及它本身不能经过,必须绕着走。即如图: boom.png 添加这个道具,我有几个改动的地方,如下: 获取每个关卡的参数,增加了炸弹的位置和周围陷阱的位置,结构体变成了这样子: type RoundParams struct { Height int //画布高度 Width int //画布宽度 BoomNum int //炸弹数量 BoomPosition [][]int //炸弹位置,坐标数组 TrapPosition ...阅读全文

博文 2020-05-16 11:32:45 onepunchgo

[译]参考资料: 地道的GO代码

目录 [−] Accept interfaces, return concrete typesCode Review CommentsEffective GoGo PatternsGo ProverbsGo and the Zen of PythonGo by ExampleIdiomatic Doc Comments: Document Your Function, Not Your Function SignatureIdiomatic GoIdiomatic Go ReadabilityIdiomatic Go TestsIdiomatic Go Trickshttps://medium.com/@matryer/idiomatic-go-tricks-62abea5c50fbItty...阅读全文

博文 2017-07-08 10:18:12 smallnest

[go]channel和select

channel channel用于协程(goroutine)间的通信,对channel进行发送(send)或接收(receive)操作可能会阻塞当前协程。 用make创建一个channel 可以用make(chan Type, BufferSize)来创建一个新的channel,Type表示channel中元素的类型,BufferSize(可选)为缓冲区大小,缓冲区过大溢出会处理成无缓冲区。 c := make(chan int) //c := make(chan int, 0) 与上面相等,没有缓冲区 缓冲区 channel有缓冲区,且缓冲区没有被填满的时候,发送操作不会阻塞goroutine, 反之没有缓冲区或缓冲区被填满的channel,发送操作会阻塞goroutine。 单向chan...阅读全文

博文 2020-01-09 14:32:53 onequid

用golang写一个简单的游戏(二)

上篇文章写到了,我已经打印出了一个从起点到终点的路径,并且这是受键盘事件控制的。今天我会继续给这个游戏添加一些东西,让它看起来像个“游戏”。 现在我要加上一个障碍,不是随便一条路径都可以从起点到终点,这个障碍就姑且叫它“炸弹”,我赋给它的规则是,它的上下左右(称之为陷阱)及它本身不能经过,必须绕着走。即如图: 添加这个道具,我有几个改动的地方,如下: 获取每个关卡的参数,增加了炸弹的位置和周围陷阱的位置,结构体变成了这样子: type RoundParams struct { Height int //画布高度 Width int //画布宽度 BoomNum int //炸弹数量 BoomPosition [][]int //炸弹位置,坐标数组 TrapPosition [][]int /...阅读全文

博文 2020-05-17 14:33:51 wx5e1abbbb0a5e5

Let US sort

## 在这篇文章里,我尝试发掘 [Go](https://golang.org/) 语言的所有特性,以便用最优的、利用多核处理器的方式来实现 [归并排序](https://en.wikipedia.org/wiki/Merge_sort)。 时间复杂度为 `O(nlogn)` 的最优排序算法中,归并排序是其中之一。它的原理为将数组分为两部分,分别进行排序,最后再归并,这种做法的开销没那么大。 ![红色表示分割和排序,绿色表示归并](https://raw.githubusercontent.com/studygolang/gctt-images/master/let-us-sort/1_I9QJGWEgHtoo9H_hgVOg4g.png) *颜色说明:红色表示分割和排序,绿色表示归并* 让...阅读全文

无脑for在程序被终止的时候协程会终止吗

func main(){ go func(){ for{ time.Sleep(1 * time.Second) fmt.Println("something") } } //此处不让程序退出 for{ time.Sleep(1*time.Second) } }以上代码。运行起来后,如果直接kill进程将他杀掉的话,内存是怎么样的情况,是不是包括起的所有协程都会被终止,若是不会,是不是会造成内存泄漏?早上看了篇文章后还是不懂。请各位指教...阅读全文

博文 2019-01-02 13:55:11 UYAD

好程序员web前端培训分享Javascript中原型属性

好程序员web前端培训分享Javascript中原型属性 本文将从以下三个方面讲解原型属性 1、 理解指针 2、 理解原型 3、 用原型的方式完成继承 以下为详细内容: 1、 理解指针 要理解JAVASCRIPT中的原型,先理解指针,在C/C++中,会提到指针,其实,指针不应该属于C/C++的专利,上篇文章中,提到的引用类型(也是很多面向对象语言中的数据类型的叫法),就是指针。 C/C++中对指针的解释:指针就是地址。地址为何物? 地址:是计算机对内存每个存储单元的管理方式。在计算机的内存中,存储着若干数据,计算机的CPU是如何读取内存中的数据的? 计算机的每个存储单元都有一个编号,就像到超市存包时,每个存包的格子都有一个编号,这个编号就是地址,内存的地址。超市每个格子为什么要有编号,目的就...阅读全文

博文 2019-04-01 15:29:12 hcxy

Golang 性能提高技术----低级优化

前言 自上篇文章写了 基础编码原则(https://www.jianshu.com/p/0dafe1059fdc ),已经过了一段时间了,此处是对上篇文章中提到的低级优化做个说明。 了解现代处理器 在单个处理器中,为了提高指令的吞吐量,实现了流水线系统。即原本一条指令的执行,需要经过取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WB)等一系列阶段。如执行一条指令需要等待上一条指令执行,那这个等待是对处理器来讲是一种浪费的行为。于是将一条执令的执行过程划分为许多的周期,在同一个周期内,多条指令处于不同阶段,比如下图:指令i做完了取指阶段,到周期2时,则会进入到了译码阶段,同时会立即让下一条指令i+1进入取指阶段,这样指令i和i+1在周期2并行执行。 本图来源:https://...阅读全文

博文 2019-06-23 01:32:43 wp_nine

GORM many2many关系表的创建和查询

最近在用golang搭建个人博客的后台,数据库选用了gorm + mySQL的组合,其中文章(articles)和标签(tags)两个表是多对多的关系,由于对数据库不是很熟悉,外加gorm的文档较为简略,在这里踩了很多的坑。现在在这篇文章中总结下实现的方法。 第一步:定义gorm表的struct type Article struct { gorm.Model Title string `gorm:"not null"` Content string `gorm:"not null"` Tags []Tag `gorm:"many2many:tag_articles"` } type Tag struct { TagId string `gorm:"primary_key"` TagName...阅读全文

博文 2020-03-28 03:32:49 _敏讷

写 Golang 程序的三条建议

写 Golang 程序的三条建议 写在前面:其实写这篇文章初衷很简单,有人质疑我的上篇文章是抄袭的,就想再写点个人心得。刚看到时有点不忿,不过转头想了想,这难道不是对文章的肯定吗?????秉着不要把写文章当作一个负担的原则,我接下来还是以 想聊什么,就写什么 的心态来面对,以免出现 "挤牙膏" 的文章。 可读性第一 优秀的代码必须保证可读性,没有可读性的代码就是 一次性产品。代码的可读性,再怎么强调也不为过。 可能会有不少朋友认为,代码最核心是为了 实现业务 。从公司角度来说,这个说法完全正确。我们作为开发者,如果以业务为第一导向,那么只会成为 码农,而 程序员 需要有技术上的思考。 程序员入门时,往往把开发认为是 实现业务需求的一次性工作。但实际情况却复杂很多:在一个软件生命周期内,你会遇...阅读全文

博文 2019-03-26 16:34:44 Junes

Golang的WaitGroup陷阱

sync.WaitGroup是并发环境中,一个相当常用的数据结构,用来等待所有协程的结束,在写代码的时候都是按着例子的样子写的,也没用深究过它的使用。前几日想着能不能在协程中执行Add()函数,答案是不能,这里介绍下。 陷阱在WaitGroup的3个函数的调用顺序上。先回顾下3个函数的功能: Add(delta int):给计数器增加delta,比如启动1个协程就增加1。 Done():协程退出前执行,把计数器减1。 Wait():阻塞等待计数器为0。 考一考 下面的程序是创建了协程father,然后father协程创建了10个子协程,main函数等待所有协程结束后退出,看看下面代码有没有什么问题? package main import ( "fmt" "sync" ) func fath...阅读全文

使用 JS 建立一个 Mixin 机器人

官方推荐使用 golang ,对于前端人员的学习门槛还是有一些。所以在这里发布一个 js 写的教程。 读完此篇文章您将获得: 一个收到消息会自动回复 hello mixin 的机器人。 1. 开发基础 node 环境,笔者目前使用v10.15.1,更高亦可。 JavaScript 语法基础 Mixin 机器人 session 及 secret 2. 开发之前 能够找到并读到这篇文章,想必对 Mixin 以及 Mixin Messenger 都比较熟知。所以申请 Mixin 机器人的 session 和 secret 并不是本文的主要内容。如有需要请进传送门 Mixin Messenger 机器人接入指南 这个时候,你应该已经获取到了 Mixin 的 session 文件 和 secret 信...阅读全文

博文 2020-02-24 21:32:59 刘泽美Neo

一文带你读懂结构体内存分配

一个博客引发的血案 一个比较牛逼的博客,介绍了如何优化字符串到字节数组的过程,避免了数据复制过程对程序性能的影响。 对此,我深感佩服。因为代码非常简单,简单到我根本看不懂! package main import ( "fmt" "strings" "unsafe" ) func str2bytes(s string) []byte { x := (*[2]uintptr)(unsafe.Pointer(&s)) h := [3]uintptr{x[0], x[1], x[1]} return *(*[]byte)(unsafe.Pointer(&h)) } func bytes2str(b []byte) string { return *(*string)(unsafe.Pointer(...阅读全文

博文 2020-04-19 20:34:20 胡大海

How To Gracefully Close Channels?(如何优雅地关闭Go channel? )

几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评: 在不能更改channel状态的情况下,没有简单普遍的方式来检查channel是否已经关闭了 关闭已经关闭的channel会导致panic,所以在closer(关闭者)不知道channel是否已经关闭的情况下去关闭channel是很危险的 发送值到已经关闭的channel会导致panic,所以如果sender(发送者)在不知道channel是否已经关闭的情况下去向channel发送值是很危险的 那些批评看起来都很有道理(实际上并没有)。是的,没有一个内置函数可以检查一个channel是否已经关闭。如果你能确定不会向c...阅读全文

博文 2018-08-21 15:35:16 豆瓣奶茶

golang中goroutine的调度

基础的参考这篇文章 https://www.zhihu.com/question/20862617 线程 Machine (M) 处理器 Process (P) 协程 Goroutine (G) 要点 P为固定个数. 一般等于cpu核数 M > P. M为线程池中. G 有全局队列 和 P下的队列. 协作式 还是 抢占式 协程的意思大概就是协作式的线程的意思? 一开始的golang是协作式的. 就是说如果一个goroutine一直在执行.. 就让他执行下去吧 . 但是这会有一个问题. golang的gc是需要stop world的. 必须所有的goroutine都停下.. so... 没办法了. 而且也不能让一个goroutine一直占用P. 会把其他goroutine饿死... 所以 1....阅读全文

博文 2019-03-11 16:34:51 个00个

Go依赖包管理工具,3分钟掌握govendor

网上写govendor的博文不少,但从安装到介绍,总看上去有些沉重,下面奉上一篇简单的教程,3分钟入门。 第1部分 简明教程 2步走,3分钟轻松搞定Go项目的依赖。 第1步 安装 go get -u github.com/kardianos/govendor 第2步 为项目增加依赖 进入到项目目录 使用govendor init命令初始化项目的依赖 运行govendor fetch命令增加依赖 打开./vendor/vendor.json查看依赖的包 步骤: cd path/to/project govendor init govendor fetch project_url_with_out_http cat vendor/vendor.json 举个例子:项目awesome依赖githu...阅读全文

博文 2018-11-17 01:34:39 大彬

你知道defer的坑吗?

你是不是觉得defer很简单、很好用,但也许你掉坑里了都不知道! 这篇文章不介绍defer的常用功能,而是介绍你在用defer时,也许会踩的坑。 defer允许我们进行一些函数执行完成后的收尾工作,并且代码更加简洁,例如: 关闭文件流: // open a file defer file.Close() 解锁一个加锁的资源 mu.Lock() defer mu.Unlock() 打印最终报告 printHeader() defer printFooter() 关闭数据库链接 // open a database connection defer disconnectFromDB() 但是: 你知道defer和defer后的函数什么时候执行吗? 你知道defer后函数里的变量值是什么时候计算的...阅读全文

博文 2018-11-16 20:34:38 大彬

Golang文件读取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/naiwenw/article/details/79281208 参考 Go实战–golang中读写文件的几种方式 读文件 读取的文件放在file/test:也就是file包下的test这个文件,里面写多一点文件 读文件方式一:利用ioutil.ReadFile直接从文件读取到[]byte中 func Read0() (string){ f, err := ioutil.ReadFile("file/test") if err != nil { fmt.Println("read fail", err) } return string(f) } 读文件方式二:先从文件读取到file中,在从fil...阅读全文

博文 2018-12-17 18:31:33 naiwenw

[系列] - go-gin-api 路由中间件 - Jaeger 链路追踪(五)

概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - 捕获异常,这篇文章咱们分享:路由中间件 - Jaeger 链路追踪。 啥是链路追踪? 我理解链路追踪其实是为微服务架构提供服务的,当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。 咱们先看一张图: 这张图的调用链还比较清晰,咱们想象一下,随着服务的越来越多,服务与服务之间调用关系也越来越多,可能就会发展成下图的情况。 这调用关系真的是... 看到这,我的内心是崩溃的。 那么问题来了,这种情况下怎么快速定位问题? 如何设计日志记录? 我们自己也可以设计一个链路追踪,比如当发生一个请求,咱们记录它的: 请求的唯一标识 请求了哪些服务? 请求的服务依次顺序? 请求的 Reque...阅读全文

博文 2019-09-16 13:02:38 新亮

[系列] - go-gin-api 路由中间件 - Jaeger 链路追踪(六)

概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(理论篇),这篇文章咱们接着分享:路由中间件 - Jaeger 链路追踪(实战篇)。 这篇文章,确实让大家久等了,主要是里面有一些技术点都是刚刚研究的,没有存货。 先看下咱们要实现的东西: API 调用了 5 个服务,其中 4 个 gRPC 服务,1 个 HTTP 服务,服务与服务之间又相互调用: Speak 服务,又调用了 Listen 服务 和 Sing 服务。 Read 服务,又调用了 Listen 服务 和 Sing 服务。 Write 服务,又调用了 Listen 服务 和 Sing 服务。 咱们要实现的就是查看 API 调用的链路。 关于一些理论的东西,大家可以去看看上篇文章或查阅一些资料,这篇文章...阅读全文

博文 2019-09-28 21:32:44 新亮

编程实战篇——Spring Boot 自动配置实现

基于Spring Boot自动配置的思想封装起来,使其他Spring Boot项目引入后能够进行快速配置。AutoConfigurationSpring Boot的一个重要特性就是提供了各种各样的AutoConfiguration。例如DataSourceAutoConfiguration。这样我们只需要在配置文件中进行如下配置:spring: datasource: url: jdbc:mysql://xxxxxxxxxxx/realname username: xxxxx password: xxxxx driverClassName: com.mysql.jdbc.DriverSpring Boot就会在容器中按照我们的配置的信息注入一个DataSource。那么Spring boot...阅读全文

博文 2018-10-19 18:03:08 dubbo

[系列] - go-gin-api 路由中间件 - 日志记录(三)

概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可。 这篇文章咱们分享:路由中间件 - 日志记录。 日志是特别重要的一个东西,方便我们对问题进行排查,这篇文章我们实现将日志记录到文本文件中。 这是我规划的,需要记录的参数: - request 请求数据 - request_time - request_method - request_uri - request_proto - request_ua - request_referer - request_post_data - request_client_ip - response 返回数据 ...阅读全文

博文 2019-09-05 19:32:42 新亮

GO 2,我们来了——2018/11/29

Go 2, here we come! 29 November 2018 道法自然,学究天人。论英语与Golang的长天一色,得翻译和技术之并驾齐驱。 背景(Background) At GopherCon 2017, Russ Cox officially started the thought process on the next big version of Go with his talk The Future of Go (blog post). We have called this future language informally Go 2, even though we understand now that it will arrive in incremental ...阅读全文

博文 2018-12-12 16:34:43 天地一小儒

【译】Go工具要点

你是刚开始使用Go工具么?或者你想扩展知识?这篇文章将会描述每个人都需要知道的Go工具参数。 免责声明:这篇文章可能会有些偏见。这篇文章描述了我个人会用到的Go工具参数,还有一些是我周围的人遇到的问题。如果你还有别的想法,在Twitter联系我。 $ go build -x -x会列出来go build调用到的所有命令。 如果你对Go的工具链好奇,或者使用了一个跨C编译器,并且想知道调用外部编译器用到的具体参数,或者怀疑链接器有bug;使用-x来查看所有调用。 $ go build -x WORK=/var/folders/00/1b8h8000h01000cxqpysvccm005d21/T/go-build600909754 mkdir -p $WORK/hello/perf/_obj/...阅读全文

Golang并发:一招掌握无阻塞通道读写

介绍Golang并发的模型写了几篇了,但一直没有以channel为主题进行介绍,今天就给大家聊一聊channel,channel的基本使用非常简单,想必大家都已了解,所以直接来个进阶点的:介绍channel的阻塞情况,以及给你一个必杀技,立马解决阻塞问题,实用性高。 阻塞场景 无论是有缓存通道、无缓冲通道都存在阻塞的情况。阻塞场景共4个,有缓存和无缓冲各2个。 无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它阻塞场景: 通道中无数据,但执行读通道。 通道中无数据,向通道写数据,但无协程读取。 // 场景1 func ReadNoDataFromNoBufCh() { noBufCh := make(chan int) <-noBufCh fmt.Println("read fro...阅读全文

博文 2018-12-27 15:34:47 大彬

深入浅出Rust-Future-Part-5.md

文:Rust futures: an uneducated, short and hopefully not boring tutorial - Part 5 - Streams本文时间:2018-12-09,译者:motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址 ,好文将在以下地方直接展示 Rust中文社区首页 Rust中文社区阅读Rust文章栏目 知乎专栏Rust中文社区 思否专栏Rust中文社区 简书专题Rust中文社区 微博Rustlang-cn Intro 在上篇文章中我们学习了如何实现一个高效率的Future(尽量不阻塞, 只有在需要时才会Unpark我们的Task). 今天继续扩展我们的Future: 实现一个Stream Trait.S...阅读全文

博文 2018-12-09 17:34:45 krircc

Golang并发模型:轻松入门select

之前的文章都提到过,Golang的并发模型都来自生活,select也不例外。举个例子:我们都知道一句话,“吃饭睡觉打豆豆”,这一句话里包含了3件事: 妈妈喊你吃饭,你去吃饭。 时间到了,要睡觉。 没事做,打豆豆。 在Golang里,select就是干这个事的:到吃饭了去吃饭,该睡觉了就睡觉,没事干就打豆豆。 结束发散,我们看下select的功能,以及它能做啥。 select功能 在多个通道上进行读或写操作,让函数可以处理多个事情,但1次只处理1个。以下特性也都必须熟记于心: 每次执行select,都会只执行其中1个case或者执行default语句。 当没有case或者default可以执行时,select则阻塞,等待直到有1个case可以执行。 当有多个case可以执行时,则随机选择1个c...阅读全文

博文 2018-12-12 13:34:41 大彬

golang积累-接口指针与结构体指针

from:https://blog.csdn.net/qq_26981997/article/details/52608081对go做过开发的朋友都很熟悉interface。这几天在网上看到了篇文章,谈到了interface与nil判等的问题。题是好题,就进一步了解了一下。原题如下:Nil接口并不是有Nil指针的接口type Cat interface { Meow()}type Tabby struct {}func (*Tabby) Meow() { fmt.Println("meow") }func GetACat() Cat { var myTabby *Tabby = nil // Oops, we forgot to set myTabby to a real value ret...阅读全文

博文 2018-06-23 12:34:41 hellomi001

简单实现hashSet -- 应用篇

简单实现hashSet -- 应用篇 写这篇文章的起因: 在使用golang和php的时候我们经常会判断一个变量是否在map或者数组中; 在php中的时候我们经常使用in_array()来判断,这里是我们经常用的。 其实用in_array()这个函数就是对数组进行遍历判断是否存在时间复杂度是log(n) 一般数组不是太大也就这样了; 但是在golang中并没有封装这个函数,这个需要我们自己去封装。 如果也是用循环的方式去判断变量是否存在,那是不是感觉很low,也就是这个原因引出了这篇文章 此篇文章GitHub地址:https://github.com/wrack0001/note/blob/master/skill/%E7%AE%80%E5%8D%95%E5%AE%9E%E7%8E%B0ha...阅读全文

博文 2019-08-07 21:32:54 王海东_011c

Golang并发模型:轻松入门select

之前的文章都提到过,Golang的并发模型都来自生活,select也不例外。举个例子:我们都知道一句话,“吃饭睡觉打豆豆”,这一句话里包含了3件事: 妈妈喊你吃饭,你去吃饭。 时间到了,要睡觉。 没事做,打豆豆。 在Golang里,select就是干这个事的:到吃饭了去吃饭,该睡觉了就睡觉,没事干就打豆豆。 结束发散,我们看下select的功能,以及它能做啥。 select功能 在多个通道上进行读或写操作,让函数可以处理多个事情,但1次只处理1个。以下特性也都必须熟记于心: 每次执行select,都会只执行其中1个case或者执行default语句。 当没有case或者default可以执行时,select则阻塞,等待直到有1个case可以执行。 当有多个case可以执行时,则随机选择1个c...阅读全文

博文 2018-12-12 14:34:47 shitaibin

用 golang 实现区块链系列七 | 网络

介绍 到现在为止,我们已经实现了一个拥有所有关键功能的区块链了:匿名,安全,还有随机生成的地址;区块链数据存储;工作量证明系统;以可靠的方式存储交易。尽管这些功能很关键,但还是有不足。到底是什么会让这些功能真的闪耀起来呢,到底是什么使得加密货币成为可能呢 —— 是网络。如果一个这样牛逼的区块链只是在一台计算机上运行有什么卵用?当只有一个用户的时候,这些基于密码学的功能有啥好处?是网络使得这些机制可以工作起来,而且变得有用。 你可以把这些区块链的功能想象成教条,类似于那种人们想要一起生活成长就要遵守的教条。这是一种社会准则。区块链网络是一个遵循着同样准则的程序社区,正式这种遵循准则使得社区得以存活。这和真实世界很相似,当人们分享了类似的思想,他们就会更强而且可以一同创造更好的生活。如果有人遵循...阅读全文

博文 2018-11-19 20:34:49 小马哥_Magical

Golang并发模型:并发协程的优雅退出

goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。这篇文章介绍,如何合理的退出goroutine,减少软件bug。 goroutine在退出方面,不像线程和进程,不能通过某种手段强制关闭它们,只能等待goroutine主动退出。但也无需为退出、关闭goroutine而烦恼,下面就介绍3种优雅退出goroutine的方法,只要采用这种最佳实践去设计,基本上就可以确保goroutine退出上不会有问题,尽情享用。 1:使用for-range退出 for-range是使用频率很高的结构,常用它来遍历数据,range能够感知channel的关闭,当chan...阅读全文

博文 2018-12-04 16:34:48 shitaibin

如何理解Golang的 “must not be copied after first use”(源码解析)

前言 阅读Golang sync包时,总会看到一句话“must not be copied after first use”,对此感到很好奇,查阅过程中发现这篇文章总结得挺到位的,因此转载,记录一下,因为我只是对于原理上面好奇,因此没有全文翻译过来,只挑选了一些自己感兴趣的地方用自己的话总结了一下,感兴趣的可以看看原文章: What does “nocopy after first use” mean in golang and how 正文 must not be copied after first use 初次使用后不能复制,sync包大多跟并发控制相关,出于安全考虑(避免指针的复制使得指针污染不安全,误操作而使程序崩溃)不能复制可以理解,但Golang是怎么样办到的呢,接下来就从源码...阅读全文

飞雪无情的博客Go语言、Android相关的十大热门文章

最近几年,写了一些博客,加起来不算多,150篇左右吧。 对于很多人来说,可能不明白我为什么写博客,写博客对于我来说,可能就像大家看电影一样,有时间就看看(写写)。对于我自己也是一些东西的总结,有时候通过写,才能加深理解。写博客还可以可以让你保持学习的心态,和读者交流,自我能力提升。 写的东西涉及各方面都有,但是以技术互联网居多,辅以管理、生活、总结等,内容有浅有深,如果你看到了,并且可以从中受益,那么这篇文章也就有了价值。 最近从这150篇中,根据阅读数,选了Golang(Go语言)、Android相关的十大热门篇文章,给大家分享。 No.10 关键词:IO Go语言实战笔记(十九)| Go Writer 和 Reader http://www.flysnow.org/2017/05/08/...阅读全文

博文 2018-10-13 08:34:39 飞雪无情

Golang并发模型:轻松入门协程池

goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理。但有时候,我们还是想控制一下。 比如,我们有A、B两类工作,不想把太多资源花费在B类务上,而是花在A类任务上。对于A,我们可以来1个开一个goroutine去处理,对于B,我们可以使用一个协程池,协程池里有5个线程去处理B类任务,这样B消耗的资源就不会太多。 控制使用资源并不是协程池目的,使用协程池是为了更好并发、程序鲁棒性、容错性等。废话少说,快速入门协程池才是这篇文章的目的。 协程池指的是预先分配固定数量的goroutine处理相同的任务,和线程池是类似的,不同点是协程池中处理任务的是协程,线程池中处理任务的是线程。 最简单的协程池模型 上面这个图展示了最简单的协程池的样子。先把协...阅读全文

微服务监测的五大原则

一、背景容器和微服务的出现并得到大量应用,从根本上改变了应用系统的组成和运行方式。而随着开发人员开始利用编排系统来管理和部署容器,规则进一步发生了变化。以往主机上的一个简单应用,现在已成为一个复杂的、动态编排的、多容器的体系架构,这同时也对应用的监测提出了全新的挑战。Sysdig,是专注于系统故障排查和监控工具的公司,其产品Sysdig Cloud是定位于容器系统故障排查和监控的平台。在今年召开的JFrog SwampUp用户大会上,Sysdig公司提出监测容器及构建在其上的微服务的五大关键原则。这些原则充分考虑了容器和微服务与传统架构在运维方式上的差异。本文即是根据Sysdig公司在本次大会上的演讲视频整理而成的。二、微服务是什么要正确地监测微服务,首先要正确地理解什么是微服务。​演讲首先...阅读全文

Goroutines的生命周期

文: A complete journey with Goroutines 在Golang中如果我们想并发的处理事情,我们使用Goroutines。 但是什么是并发呢? 这儿有个例子:我正在写这篇文章突然感到口渴 ,我将停止打字然后去喝水,然后我将继续开始打字。现在,我通过时间切片的方式同时处理了2件事情(打字和喝水),这就被说成是并发工作。这里需要指明的是这两件任务(写字和喝水)不是在同一时间被处理的 。如果事情是在同一时间被处理的,那么它们就被叫做并行(例如一边玩你的手机一边吃薯片)。 因此并发是同时处理多件事情(没有必要在相同的时间做...阅读全文

博文 2020-01-21 23:32:40 小秀秀better

飞雪无情的博客Go语言、Android相关的十大热门文章

最近几年,写了一些博客,加起来不算多,150篇左右吧。 对于很多人来说,可能不明白我为什么写博客,写博客对于我来说,可能就像大家看电影一样,有时间就看看(写写)。对于我自己也是一些东西的总结,有时候通过写,才能加深理解。写博客还可以可以让你保持学习的心态,和读者交流,自我能力提升。 写的东西涉及各方面都有,但是以技术互联网居多,辅以管理、生活、总结等,内容有浅有深,如果你看到了,并且可以从中受益,那么这篇文章也就有了价值。 最近从这150篇中,根据阅读数,选了Golang(Go语言)、Android相关的十大热门篇文章,给大家分享。 No.10 关键词:IO Go语言实战笔记(十九)| Go Writer 和 Reader http://www.flysnow.org/2017/05/08/...阅读全文

博文 2018-10-17 19:44:31 飞雪无情

[Golang软件推荐] Golang通用连接池

连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrift-Clinet链接Service端使用的时候出现了并发问题,然后找到了一个通用的连接池的库在这里分享给大家. 附上: 喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-pool 1.连接池 在使用之前我们需要先了解清楚连接池的概念,总结下来连接池主要解决以下几类问题: 减少连接创建时间 与数据库还是Thrift等程序建立连接都是有开销的。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。 简化的编程模式 当使用连接池时,具体的操...阅读全文

博文 2020-02-21 14:32:47 文振熙

广度优先配合匿名函数爬取

package mainimport ( "fmt" "log" "net/http" "os" "golang.org/x/net/html")var ( str string = "https://docs.hacknode.org/gopl-zh/")//CreatFile is a func ti make infomation in filefunc CreatFile(bt []byte) { f, err := os.OpenFile("F:/MyGo/src/practice/url.txt", os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatal(err) } defer f.Close() res, err :=...阅读全文

博文 2018-06-27 11:34:55 哆啦在这A梦在哪

Go 面向对象式编程

『就要学习 Go 语言』系列 -- 第 25 篇分享好文 Go 语言没有对象的概念,但是 struct 类型有着和对象类似的特性。struct 类型可以定义自己的属性和方法。这篇文章我们来总结下 Go 语言中关于 “继承” 和多态的概念。 嵌入类型 嵌入类型是指将已有的类型直接声明在新的结构类型里。不像 Java、C++ 等语言,Go 语言没有继承,但是可以通过组合的方式实现代码的复用。 type User struct { Name string Email string } type Admin struct { User Level string } func (u *User) Speak() { fmt.Println("I am user",u.Name) } 复制代码上面的代码...阅读全文

博文 2019-06-12 11:04:22 Seekload

10分钟将你的Go工程转换为Go Module模式

引言自从在Go 1.11和更高版本中引入了Go的新的依赖管理系统以来,GoLang开发人员已经接受了包版本控制解决方案。这样做的用户可以使用GoCenter存储库中的不可变公共Go 模块,并通过更健壮、更可靠的Go Pipeline获得更快的构建速度。但是,将现有的项目转换为使用Go Module并不总是很容易,尤其是如果该项目已经尝试过GoLang的其他包管理解决方案时。为了帮助GoLang社区正确地使用Go Module,我们将使用开源的etcd项目(Kubernetes使用的键值数据存储)作为示例。这是一个最佳实践的实际示例,因为它足够复杂,可以展示一些常见的实践PS:在上一篇关于Go语言开发的的文章中(传送门:Go 语言依赖管理的优势),我们介绍了Go 依赖管理的发展历史以及Go M...阅读全文

博文 2020-03-05 18:25:06 JFrogChina

Prometheus 折腾笔记

《 Prometheus 折腾笔记 》

最近以来都很想写写关于这段时间以来折腾 Prometheus 的心得,但是人总是有惰性的,拖延是会上瘾的。 正所谓,拖更一时爽,一直拖就一直爽 ????。 有时候人的动力来源就很迷,你也说不出为什么,就是突然地他就心血来潮开写了,像这样 ????! ### 目录 * [0x01-云原生的来源](https://github.com/chenjiandongx/prometheus101/blob/master/0x01-云原生的来源.md) * [0x02-监控系统](https://github.com/chenjiandongx/prometheus101/blob/master/0x02-监控系统....阅读全文

博文 2020-02-06 12:22:48 chenjiandongx

Go基础学习记录 - 编写Web应用程序 - 添加编辑和保存功能(二)

添加编辑和保存功能 继续上篇文章【Go基础学习记录 - 编写Web应用程序 - 添加编辑和保存功能(一)】 如果将上篇文章的逻辑进行构建并运行,试图访问一个不存在的wiki,比如/view/APageThatDoesntExist,将看到包含HTML的空页面。这是因为它忽略了loadPage的错误返回值,并继续尝试填写没有数据的模板。相反,如果请求的页面不存在,它应该将客户端重定### 处理不存在的页面修改下viewHandler来达到我们的需求,如下 func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] p, err := loadPage(title) ...阅读全文

博文 2018-08-08 11:34:48 DurbanZhang

基于React Context Api 和 Es6 Proxy的状态管理

近几个月的工作中,有遇到一些场景:基本不需要全局的状态管理,但页面级的,肯定需要在一些组件中共享,引入Redux这类状态管理库有点繁琐,直接通过props传递的话,写起来总觉得不是那么优雅。刚好项目中React版本比较新,就试了下Context Api,代码大致如下: // Context.js const Context = React.createContext( {} // default value ) export const Provider = Context.Provider export const Consumer = Context.Consumer // App.jsx import {Provider} from './Context' import Page fr...阅读全文

博文 2019-01-25 23:34:42 孤丶狼丶

一些不常见的Go命令参数详解

你是刚开始使用Go工具么?或者你想扩展知识?这篇文章将会描述每个人都需要知道的Go工具参数。免责声明:这篇文章可能会有些偏见。这篇文章描述了我个人会用到的Go工具参数,还有一些是我周围的人遇到的问题。如果你还有别的想法,在Twitter联系我。$ go build -x-x会列出来go build调用到的所有命令。如果你对Go的工具链好奇,或者使用了一个跨C编译器,并且想知道调用外部编译器用到的具体参数,或者怀疑链接器有bug;使用-x来查看所有调用。$ go build -x WORK=/var/folders/00/1b8h8000h01000cxqpysvccm005d21/T/go-build600909754 mkdir -p $WORK/hello/perf/_obj/ mkdi...阅读全文

博文 2018-01-06 15:57:07 erlib

[Golang软件推荐] Golang通用连接池

连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrift-Clinet链接Service端使用的时候出现了并发问题,然后找到了一个通用的连接池的库在这里分享给大家. 附上: 喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-pool 1.连接池 在使用之前我们需要先了解清楚连接池的概念,总结下来连接池主要解决以下几类问题: 减少连接创建时间 与数据库还是Thrift等程序建立连接都是有开销的。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。 简化的编程模式 当使用连接池时,具体的操...阅读全文

博文 2020-02-21 14:32:48 文振熙

使用Go开发前端应用(三)

前言 在写这个系列第一篇文章的时候,有些朋友可能不知道wasm能够使用在什么场景,虽然在评论里面有提及,但是没有上具体的例子,这篇文章,使用一个具体的例子来示范下wasm的使用场景。这篇文章主要会讲以下几个方面的东西: md5简单介绍 使用Go计算文件md5 使用js计算文件md5 性能对比 文件秒传什么实现的? md5的简单介绍 md5 简单的说就是它是一种散列算法,在以前有很多网站或者系统,都是使用 md5 来加密的,md5 的特征是,任意长度的输入,它都可以给你生成一个128位的结果出来,而且只要输入不一样,输出的结果肯定不一样(现在据说会有hash碰撞,不过我们这里不讨论)。128位使用16进制的数字表示就是32位了。不过,在现在的系统中,应该是没有再使用md5来加密密码的了,因为 ...阅读全文

博文 2020-05-07 10:35:31 zhongzhong05