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

Go 方法(第二部分)

这篇文章介绍了关于 Go 语言中方法的剩余部分。强烈建议先阅读[第一部分](https://studygolang.com/articles/14061) 的介绍部分。 ## 方法表达式 如果有这样一个类型 T,它的方法集中包含方法 M,则 T.M 会生成一个与方法 M 几乎相同且带有签名的方法,这称为 *方法表达式*。不同之处在于,它额外附带的第一个参数与 M 的接收者类型相等。 ```go package main import ( "fmt" "reflect" ) func PrintFunction(val interface{}) { t := reflect.TypeOf(val) fmt.Printf("Is variadic: %v\n", t.IsVariadic()) ...阅读全文

Functional Go: Transient 及持久化

在之前的文章中,我们介绍了一些持久化数据结构实现的基本原理和 Vector Trie 这一数据结构在 Golang 下的实现过程。 这篇文章终于来到了实现持久化 List 的最后一步: 实现 Transient 和持久化的功能。 这篇文章是系列文章的一部分,如果还没有浏览过文章的其它部分请参考: 持久化数据结构简介 Vector Trie 的实现 Transient 及持久化 (本文) 在之前的文章中,我们已经看到了如何实现一个 Vector Trie,也知道如何使用 Vector Trie 来实现共享数据结构的持久化 List: 在每次修改时,我们复制从根节点到被修改节点路径上的所有节点,并使用得到的新的 Root 节点构造一个新的 List 的 HEAD 数据结构。这样通过新的 HEAD...阅读全文

博文 2017-09-26 22:36:33 meter

Angular2+ 使用 Protocol Buffers

just do it 最近在写一个web IM 项目,虽然本人主打golang后端,但是部分前端还是需要自己解决。因为这是一个IM系统,所以不考虑使用json来传送数据,改用protocol buffers ,优点见官网。由于前端不太熟练,经常被Angular坑,包括这次,花费我一个下午时间来解决Angular2+ 使用 Protocol Buffers的问题。 灵感来源:Using protocol buffers with Node.js + Swagger + Angular 进入正题,本机环境 Linux ubuntu 1. 定义一个简单的 .proto 文件 具体的protocol buffers 的.proto文件定义见官网,下面展现一个简单的小例子: // Protocol.p...阅读全文

博文 2019-01-24 02:34:40 旅行时序

Python进阶:切片的误区与高级用法

众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组...)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象。通常来说,切片的作用就是截取序列对象,然而,它还有一些使用误区与高级用法,都值得我们注意。所以,本文将主要跟大家一起来探讨这些内容,希望你能学有所获。 事先声明,切片并非列表的专属操作,但因为列表最具有代表性,所以,本文仅以列表为例作探讨。 1、切片的基础用法 列表是 Python 中极为基础且重要的一种数据结构,我曾写过一篇汇总文章(链接见文末)较全面地学习过它。文中详细地总结了切片的基础用法,现在回顾一下: 切片的书写形式:[i : i+n : m...阅读全文

博文 2018-12-23 22:34:43 豌豆花下猫

10分钟写出javaRedis客户端,被阿里直接聘用

JAVA开发者出去招聘面试,主要是必问Redis。Redis包括客户端和服务端2个部分,本次就是根据手写1个Redis的客户端,让你把握里边的专业知识。小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!RESP协议RESP协议是Redis客户端和服务端之间的通讯协议,其实我是依据这个协议来建立客户端的。协议几条要领:1、客户端和服务端通过TCP开展数据交互式2、 传送的数据遵照RESP协议,如下:每一段数据根据 开展分隔,每段数据根据1个独特标示作为开头* 代表数组$ 多行字符串+ 单行信息- 错误信息: 整型数字不能掌握没...阅读全文

博文 2019-01-08 22:31:42 javaGO007

如何成为一名大数据工程师?

未来,对熟练的大数据工程师的需求将急速增长。现实的情况是这样的,无论公司属于哪个行业,要想在当今竞争激烈的市场环境中取得成功,需要一个强大的软件架构用来存储和访问公司数据,最好从公司创立一开始就要搭建它。在如今有时候有数据的地方就叫大数据,这未免有些夸张,在本文中统称为数据工程师和数据科学家。先了解一下,数据工程师究竟做什么事?一个人怎么样成为数据工程师?我们将讨论这个有趣的领域以及如何成为数据工程师。 数据工程师都做什么?数据工程师负责创建和维护分析基础架构,该基础架构几乎可以支持数据世界中的所有其他功能。他们负责大数据架构的开发、构建、维护和测试,例如数据库和大数据处理系统。大数据工程师还负责创建用于建模,挖掘,获取和验证数据集合等流程。在这里还是要推荐下我自己建的大数据学习交流群:52...阅读全文

博文 2019-05-20 18:34:45 大数据交流

比特币地址生成全步骤(golang实现)

通过椭圆曲线算法生成公钥 对公钥进行sha256散列和ripemd160散列,获得publickeyHash 在publickeyHash前面加上version(版本)字节数组获得versionPublickeyHash 对versionPublickeyHash进行两次sha256散列并取前4位字节,获得tailfHash 将tailfHash拼接到versionPublickeyHash后面,获得公钥的最终Hash即finalHash 最后将finalHash进行Base58编码(一种可视化工具)得到比特币地址 曾经有个疑问,为何比特币生成地址要这么麻烦,既然非对称加密只拥有公钥是无法倒推出私钥的,为何不直接使用公钥当地址,而是对公钥进行hash多次来取得地址,直到最近看了篇文章才明白,...阅读全文

java12马上要发布了,程序员集体大喊:我可以坚持使用java8吗?

坐上长征三号也拼不过Java的升级速率,许多程序员们高喊,我可不可以坚持运用 Java 8?!可是对于已使用到 LTS 版本的 Java 11 开发人员,是不是还有必要往上强制升级?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!​相距 Java 11 的宣布公布已过去了一个半月,而 Java 12 也已经来到的道上。按照先前开源中国参与的某项有关开发人员运用的 Java 版本的调研提示,Java 8 依然是开发人员的主流选用,而 Java 11 是 Java 8 之后的首例 LTS 版本,因此有许多开发人员表示会选择升到...阅读全文

博文 2019-01-08 22:45:09 javaGO007

Go gRPC进阶-proto数据验证(九)

[原文地址](https://bingjian-zhu.github.io/2020/04/23/Go-gRPC%E8%BF%9B%E9%98%B6-proto%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81%EF%BC%88%E4%B9%9D%EF%BC%89/) ### 前言 上篇介绍了[go-grpc-middleware](https://github.com/grpc-ecosystem/go-grpc-middleware)的`grpc_zap`、`grpc_auth`和`grpc_recovery`使用,本篇将介绍`grpc_validator`,它可以对gRPC数据的输入和输出进行验证。 ### 创建proto文件,添加验证规则 这里使用第三方插件[g...阅读全文

博文 2020-04-23 15:38:36 939496716

RocketMQ主从如何同步消息消费进度?

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 前面我也跟大家讲述了 RocketMQ 读写分离的规则,但是你可能会问,主从服务器之间的消费进度是如何保持同步的?下面我来给大家解答一下。 如果消费者消费模式不同,也会有不同的保存方式,消费者端的消息消费进度保存到 OffsetStore 中,他有两个实现类: org.apache.rocketmq.client.consumer.store.LocalFileOffsetStore // 本地消费进度保存实现 org.apache.rocketmq.client.consumer.store.RemoteBrokerOffsetStore // 远程消费进度保存实现 其中,如果是广播...阅读全文

博文 2019-10-25 20:32:49 aside section._1OhGeD

Golang并发模型:select进阶

特性 nil的通道永远阻塞,即不执行。 break跳出for? select{}阻塞。 select应用场景 无阻塞的读、写通道 给某个请求/处理,设置超时时间,一旦超时时间内无法完成,则停止处理 有多个通道需要处理,哪个可以处理,就处理哪个 并发系列文章推荐 Golang并发模型:轻松入门流水线模型 Golang并发模型:轻松入门流水线FAN模式 Golang并发模型:并发协程的优雅退...阅读全文

博文 2018-12-08 16:34:45 shitaibin

大白话讲述Golang-Web开发入门篇-1

BestGolanger 一.开篇: 首先现在Web端大多数都是采用前后端分离,包括移动端更是不必多用说,网站弄个Vue或者Angular,后端使用Java或者Go或者是Nodejs或者Python等等 前端呢就是展示数据渲染出一个效果,可以理解为后端是盖楼,前端就是装修,对于用户来说,都是必要的二者也是密不可分,后端呢如果往白话来讲,就是数据的存取、计算、应对前端传过来的指令进行相应的存取、计算等作出回馈返还给前端。后端最基本的构造是什么呢,首先后端服务就像一个饭店,里面都是服务员,时刻等待着接收指令,前端就是顾客,前端说,服务员给我注册个账号,服务员说马上到,卡卡几下就告诉顾客,先生您要注册的账号注册好了,吧啦吧啦...二.翠花上酸菜 说点干货最基本的web服务需要具备以下东西:1.Ro...阅读全文

博文 2019-12-27 16:32:45 简书的王布斯

Go每日精选(2019-06-15)

基础部分 1.我们用 Go 替换 Python 的原因 2.为什么我最喜欢的编程语言是 Go 3.Golang json解析与生成 4.go mod 使用 5.在Go中构建并发TCP服务器 进阶部分 1.记一次go panic问题的解决过程 2.记一次golang中sync.Map并发创建、读取的问题 3.golang复用http.request.body 4.golang sql连接池的实现方法详解 5.图解Golang的内存分...阅读全文

博文 2019-06-15 19:32:40 凯文不上班

总结了才知道,原来channel有这么多用法!

这篇文章总结了channel的10种常用操作,以一个更高的视角看待channel,会给大家带来对channel更全面的认识。 在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。 channel的使用场景 把channel用在数据流动的地方: 消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步 ... channel的基本操作和注意事项 channel存在3种状态: nil,未初始化的状态,只进行了声明,或者手动赋值为nil active,正常的channel,可读或者可写 closed,已关闭,千万不要误认为关闭channel后,channel的值是nil channel可进行3种操作: 读 写 关闭 把这3种操...阅读全文

博文 2019-01-21 20:34:45 shitaibin

golang Interface 泛型编程

严格来说,在 Golang 中并不支持泛型编程。在 C++ 等高级语言中使用泛型编程非常的简单,所以泛型编程一直是 Golang 诟病最多的地方。但是使用 interface 我们可以实现泛型编程,我这里简单说一下,具体可以参考我前面给出来的那篇文章。比如我们现在要写一个泛型算法,形参定义采用 interface 就可以了,以标准库的 sort 为例。 package sort // A type, typically a collection, that satisfies sort.Interface can be // sorted by the routines in this package. The methods require that the // elements of ...阅读全文

博文 2019-06-18 23:32:46 jaydenZou1228

gRPC负载均衡(自定义负载均衡策略)

### 前言 上篇文章介绍了如何实现gRPC负载均衡,但目前官方只提供了`pick_first`和`round_robin`两种负载均衡策略,轮询法`round_robin`不能满足因服务器配置不同而承担不同负载量,这篇文章将介绍如何实现自定义负载均衡策略--`加权随机法`。 `加权随机法`可以根据服务器的处理能力而分配不同的权重,从而实现处理能力高的服务器可承担更多的请求,处理能力低的服务器少承担请求。 ### 自定义负载均衡策略 gRPC提供了`V2PickerBuilder`和`V2Picker`接口让我们实现自己的负载均衡策略。 ```go type V2PickerBuilder interface { Build(info PickerBuildInfo) balancer.V2...阅读全文

博文 2020-05-20 17:12:40 939496716

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

上篇文章中,留下了一些问题。尽管我已经添加了一个设定“炸弹”,在炸弹周围的位置是不能经过的,但是炸弹的数量还是太少,所以有些单调。我想要让游戏变得丰富些,就要增加炸弹的数量。这里就有个问题,炸弹的位置是随机的话,那就可能出现炸弹堵住了去路,造成死局,上篇文章中提到的m×n的画布上最多能有多少个炸弹这个问题不是很有意义,比如下图: 这种排列是最多个炸弹的情况,但它没啥用处。我们的问题应该是最少有多少个炸弹就能造成死局。最少是2颗炸弹就可以造成死局,但这种特色情况,我们已经做了处理--不能在起点和终点的周围有炸弹。除去这种特殊情况外的其他情况,最少有几个炸弹就能造成死局,不难想到是以下的情况: 把规律描述一下就是,取出m和n之中的最小数min,min除以3,如果整除则是min/3,如果有余数,则...阅读全文

博文 2020-05-25 17:34:13 wx5e1abbbb0a5e5

关于写文章的反思

看了一下我之前写的文章,有多少是水篇数?复制别人的列子有多少? 自已真正有心得的,又写了多少? 我过了需要用数量来证明自己的时候了 从今天开始,删掉那些水文,质量不高的,尽可能完善。 我可能写不了多好,但是我要求我写的东西能拿得出手。 补: session及JWT及Oath的使用。 MySql的sql语句优化。 Git遇到的问题及解决方案。 Golang的使用及避坑。 用心点...阅读全文

博文 2018-07-27 09:34:48 送你一碗大麦茶

软件开发技术经验总结

众所周知,软件项目成功必要因素很多,泛泛来说,下面几条也缺一不可。 1. 完备调研,项目需求分析完美契合用户或者客户所需所想 2. 开发实施:设计、Coding、测试、部署、运维,每一流程都达到或者超出预期目标 3. 市场推广:销售或市场人员对产品合理推广这篇文章将更多的集中在第二条开发实施这块,做一些常见的技术经验,希望对大家有一些借鉴。设计这块,请参考 “产品开发技术文档模板”这篇文章。Coding泛泛的模块化,SOA等等这些概念,这里不想赘述,这儿更多分享一些实战经验,不限开发语言。 1. 线程安全:Coding简单来说就是逻辑性的调用基本库API /开源库的API 及语言基本组成部分(语法、结构、变量、常量、语句、函数等),给定输入,输出预期输出,因此,编码者应本着对程序负责的态度,...阅读全文

博文 2019-01-31 16:34:44 cli1871

k8s使用Job执行任务失败了怎么办

Kubernetes 中使用 Job 和 CronJob 两个资源分别提供了一次性任务和定时任务的特性,这两种对象也使用控制器模型来实现资源的管理,我们在这篇文章来介绍Job执行如果失败了会怎么样呢? 修改job-fail.yaml,故意引入一个错误: Never 如果将 restartPolicy 设置为 Never 会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。 运行 Job 并查看状态,可以看到Never策略的job,pod失败后,重新创建: 直到重新创建7个(spec.backoffLimit默认为6,即重试6次,共7个pod)pod都失败后,认为失败,job的status里会更新为Failed 当前 Completion 的数量为 0 查看 Pod 的状态:...阅读全文

博文 2019-10-16 10:33:20 小碗汤

剥开比原看代码16:比原是如何通过/list-transactions显示交易信息的?

作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 在前一篇文章中,我们试图理解比原是如何交易的,但是由于内容太多,我们把它分成了几个小问题,并在前一篇解决了“在dashboard中如何提交交易信息”,以及“比原后台是如何操作的”。 在本文我们继续研究下一个问题:在提交的交易成功完成后,前端会以列表的方式显示交易信息,它是如何拿到后台的数据的?也就是下图是如何实现的: 由于它同时涉及到了前端和后端,所以我们同样把它分成了两个小问题: 前端是如何获取交易数据并显示出来的? 后端是如何找到交易数据的? 下面依次解决。 前端是如何获取交易数据并显示出...阅读全文

博文 2018-07-23 16:34:48 比原链Bytom

Kafka消息体大小设置的一些细节

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 还记得前几天有个小伙伴跟我反馈发送消息时提示请求数据过大的异常吗?经过调整 max.request.size 的大小之后,又报了了如下异常: image 查看相关资料后,发现 Broker 端对 Producer 发送过来的消息也有一定的大小限制,这个参数叫 message.max.bytes,这个参数决定了 Broker 能够接收到的最大消息的大小,它的默认值为 977 KB,而 max.request.size 的值已经设置成 2M 大小了,很显然已经比 message.max.bytes 大了很多,因此消息大于 997KB 时,就会抛出如上异常。 值得一提的是,主题配置也有一个参...阅读全文

博文 2019-10-28 23:33:00 aside section._1OhGeD

golang进阶(七)——go语言的几种测试方法

前言 用了go的测试框架,再想下junit的,虽然已经Junit5,那丑陋程度还是依然。 java出来的时候,还没有很多软件工程的概念,语言先出来了,因此需要通过不同的插件慢慢补。 go就很幸运,出来的时候很多软件工程的概念已经基本定了下来,可以加到语言特性之中,go的测试就简便很多,不愧是为工程而生的语言 需要测试的程序 我们需要测试的程序文件叫做utils.go,里面有个字符串反转的方法Reverse,代码相对简单,这里就不赘述了 func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } ...阅读全文

博文 2018-04-10 16:32:07 lastsweetop

Docker 使用中的一些最佳实践

Docker 使用中的一些最佳实践 本文将记录: 在使用 Docker 的过程中整理出来的最佳实践。 其他 Docker 使用者发布的(可能会是翻译过来的,全部附带原始链接)经过验证的最佳实践。 所以,本文将长期更新。 Docker 安装相关 如果安装完成后使用 docker 时出现下面的错误: > Cannot connect to the Docker daemon. Is 'docker -d' running on this host? 参考这里的内容,我们需要执行下面的命令来安装 apparmor: sudo apt-get install apparmor Docker 使用相关 使用 Bash Aliases 简化 Docker 使用命令,灵感来自于一篇很好的文章(发布这篇文章...阅读全文

博文 2017-02-10 13:43:59 Xiaohui Wang

用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

LeetCode146 动手实现LRU算法

146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 进阶: 你是否可以在 O(1) 时间复杂度内完成这两种操作? 示例: LRUCache cache = new LRUCache( 2 /* 缓存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache...阅读全文

博文 2018-10-22 15:34:40 TomorrowWu

Go gRPC进阶-proto数据验证(九)

前言 上篇介绍了go-grpc-middleware的grpc_zap、grpc_auth和grpc_recovery使用,本篇将介绍grpc_validator,它可以对gRPC数据的输入和输出进行验证。 创建proto文件,添加验证规则 这里使用第三方插件go-proto-validators自动生成验证规则。 go get github.com/mwitkow/go-proto-validators 1.新建simple.proto文件 syntax = "proto3"; package proto; import "github.com/mwitkow/go-proto-validators/validator.proto"; message InnerMessage { // s...阅读全文

博文 2020-04-26 10:26:19 FireworksEasyCool

[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

让Java程序员再次生机勃勃,还是技术的力量

大多数人选择Java可能只是因为听说Java前景好、Java比较好找工作、Java语言在TIOBE排行榜上一直位于前三等等之类的原因,但是Java真的还是之前那么好吗?答案是肯定的。 下面给大家分享一下阿里大牛整理的Java架构进阶技术知识导图 开源框架解析 学习 SSM 的基本用法能够帮助你完成绝大多数开发任务,掌握了高级用法能够提出更好的解决方案。学习框架没有捷径,在工作中一遍一遍地练习是唯一的方式。 很多人面试失败就败在原理上,只知其一,不是其二,稍微问的深入一点就答不上来了。理解原理就是理解 SSM 框架的灵魂,这也是一个程序员从体力劳动进阶到脑力劳动的门槛。 不理解原理只能做写代码的工具,理解原理才能成为真正的开发工程师。多思考、多总结、多请教,保持好奇心,多问一句是什么、为什么,...阅读全文

博文 2019-02-22 11:51:50 JavaWDB

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

LeetCode-9-回文数

题目描述 回文数 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3: 输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。 进阶: 你能不将整数转为字符串来解决这个问题吗? 思路 比较简单,先转成字符串再判断是否为回文即可 Code Golang func isPalindrome(x int) bool { if x < 0 { return false } s := strconv.Itoa(x) bs := []...阅读全文

博文 2019-07-17 00:32:41 monigo

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

这是一份全面 & 详细的Android学习指南

核心分析内容 对于怎么学习Android,主要解决的是3个问题:学什么、怎么学 & 怎么用。 具体如下: image.png 下面,我将带着上述几个问题,详细讲解自身学习Android的方法和Android学习路径;最后,还会结合前面内容,给出综合的具体执行学习Android的建议。 学什么? 面向Android初、中级开发者,对于要学习的Android理论知识,我认为主要包括: Android基础 & 常用 Android进阶 与时俱进、热门技术 编程语言 计算机基础 具体介绍如下: 1.1 Android基础 & 常用 针对Android基础&常用知识,按照优先级最主要的知识点主要包括:四大组件、布局使用、多线程 & 动画 具体介绍如下: image.png 1.2 Android进阶 ...阅读全文

博文 2019-08-09 20:32:57 Android阿沁

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

Java 进阶面试问题列表

面向对象编程的基本理念与核心设计思想解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)。继承(Inheritance)与聚合(Aggregation)的区别在哪里。你是如何理解干净的代码(Clean Code)与技术负债(Technical Debt)的。描述下常用的重构技巧。阐述下SOLID 原则。其他的譬如 KISS,DRY,YAGNI 等原则又是什么含义。什么是设计模式(Design Patterns)?你知道哪些设计模式?你有了解过存在哪些反模式(Anti-Patterns)吗?你会如何设计登陆舰/数学表达式计算程序/一条龙?你知道哪些基本的排序算法,它们的计算复杂度如何?在给定数据的情况下你会倾向于使...阅读全文

博文 2018-10-10 21:06:05 Java007

月薪 50K 大牛整理!六大Java架构进阶技术模块,看完茅塞顿开!

大多数人选择Java可能只是因为听说Java前景好、Java比较好找工作、Java语言在TIOBE排行榜上一直位于前三等等之类的原因,但是Java真的还是之前那么好吗?​下面给大家分享一下月薪50K大牛整理的Java架构进阶技术知识导图开源框架解析学习 SSM 的基本用法能够帮助你完成绝大多数开发任务,掌握了高级用法能够提出更好的解决方案。学习框架没有捷径,在工作中一遍一遍地练习是唯一的方式。很多人面试失败就败在原理上,只知其一,不是其二,稍微问的深入一点就答不上来了。理解原理就是理解 SSM 框架的灵魂,这也是一个程序员从体力劳动进阶到脑力劳动的门槛。不理解原理只能做写代码的工具,理解原理才能成为真正的开发工程师。多思考、多总结、多请教,保持好奇心,多问一句是什么、为什么,才能探索到框架的...阅读全文

博文 2019-01-17 00:15:23 javajiaoliu

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

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

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