Go 语言的优点,缺点和令人厌恶的设计

这是关于 「[Go是一门设计糟糕的编程语言 (Go is not good)](https://github.com/ksimka/go-is-not-good)」 系列的另一篇文章。Go 确实有一些很棒的特性,所以我在这篇文章中展示了它的优点。但是总体而言,当超过 API 或者网络服务器(这也是它的设计所在)的范畴,用 Go 处理商业领域的逻辑时,我感觉它用起来麻烦而且痛苦。就算在网络编程方面,Go 的设计和实现也存在诸多问题,这使它看上去简单实际则暗藏危险。 写这篇文章的动机是因为我最...阅读全文

2018-05-06 22:44:53 Donng
阅读:52542 评论:16

Golang web开发目录结构说明

通常开发项目开发时目录结构可以随意设计,但好的目录结构能让代码显得更加清晰。 Golang web 项目通用目录结构说明: projectName # 项目名称 |-- app # 应用程序目录 |---- controllers # 控制器,入参校验 |---- middleware # 中间件 |---- routers # 路由 |---- services # 业务逻辑处理 |-- config # 配置文件 |-- dao # 数据库访问 |-- models # 数据模型 |-- s...阅读全文

阅读:5814 评论:0

Golang多平台交叉编译

Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下。 Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go Linux 下编译 Mac 和 Windows 64位可执行程序 CGO_ENABLED=0 GOO...阅读全文

阅读:6228 评论:0

Golang,kafka实现消息推拉

Kafka的安装与启动 kafka中涉及的名词 消息记录:由一个key,一个value和一个时间戳构成,消息最终存储在主题下的分区中,记录在生产中称为生产者记录,在消费者中称为消费记录。Kafka集群保持了所有发布的消息,直到它们过期,无论消息是否被消费了,在一个可配置的时间段内,Kafka集群保留了所有发布的消息。比如消息的保存策略被设置为2天,那么在一个消息被发布的两天时间内,它都是可以被消费的。Kafka的性能是和数据量无关的常量级的,所以保留太多数据并不是问题 生成者:生产者用于发布消息...阅读全文

阅读:16364 评论:1

golang如何使用sarama访问kafka

https://www.jianshu.com/p/3102418e5a7d golang如何使用sarama访问kafka golang连接kafka有三种client认证方式: 无认证 TLS认证 SASL/PLAIN认证, (其他SASL/SCRAM, SASL/GSSAPI都不支持) 下面一个客户端代码例子访问kafka服务器,来发送和接受消息。 使用方式 命令行参数 $ ./kafkaclient -h Usage of ./client: -ca string CA Certific...阅读全文

2019.01.29 14:54 wz998
阅读:6629 评论:0

Golang 中迭代读取 channel

欢迎再次来到我的 Go 语言私人教学课堂,今天我们的主题是,我曾经很难理解的 ( 还好现在已经理解了 ):在 Go 程中迭代读取 `channels`。 在开始之前,让我们先回忆一下。我们都知道,一个 Go 程的存活周期是建立在 main 进程之上的,举个例子: ```go package main import "fmt" func main() { go func() { fmt.Println("hello there") }() } ``` ...阅读全文

阅读:5132 评论:0

IO多路复用与Go网络库的实现

去年在读UNP等几本书时都涉及到IO及相关知识,不过由于点很零散,当时没有总结。趁这次看golang net包的机会,结合之前看的比较基础的概念写了这篇博客,记录下现在的理解,方便以后回顾。 IO多路复用Unix网络编程里总结了5种IO模型,其中只有异步IO模型是异步IO,因为只有异步IO的recvfrom是不阻塞进程的。首先每个IO读操作都包括以下两个过程,书里说的异步就是指发起读操作时,数据从内核拷贝到用户空间是否要阻塞进程这个问题。 等待网络数据到达网卡并读取到内核缓冲区,数据准备好。 从...阅读全文

2018-02-18 00:00 nino's blog
阅读:5099 评论:0

Go语言interface底层实现

Go的interface源码在Golang源码的runtime目录中。 Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。 Go的interface是由两种类型来实现的:iface和eface。 其中,iface表示的是包含方法的interface,例如: type Person interface { Print() } 而eface代表的是不包含方法的interface,即 type Person interface {} ...阅读全文

阅读:691 评论:0

图解Golang的channel底层原理

废话不多说,直奔主题。 ## channel的整体结构图 ![](https://i6448038.github.io/img/channel/hchan.png) 简单说明: + ``buf``是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表 + ``sendx``和``recvx``用于记录``buf``这个循环链表中的~发送或者接收的~index + ``lock``是个互斥锁。 + ``recvq``和``sendq``分别是接收(<-cha...阅读全文

2019-05-28 12:17:10 RyuGou
阅读:9657 评论:3

Golang字符编码转换 - gcharset

文章来源:https://goframe.org/encoding/gcharset/index gcharset 强大的字符编码转换模块。 支持的字符集: 中文 : GBK/GB18030/GB2312/Big5 日文 : EUCJP/ISO2022JP/ShiftJIS 韩文 : EUCKR Unicode : UTF-8/UTF-16/UTF-16BE/UTF-16LE 其他编码 : macintosh/IBM*/Windows*/ISO-* 使用方式: import "github.co...阅读全文

阅读:4539 评论:0

errgroup 使用

errgroup 在 ```WaitGroup``` 的基础上实现子协程错误传递, 同时使用 context 控制协程的生命周期。 ## 使用 errgroup 的使用非常简单 ```go package main import ( "context" "fmt" "time" "golang.org/x/sync/errgroup" ) func main() { group, _ := errgroup.WithContext(con...阅读全文

2019-07-17 15:18:26 jsysjam
阅读:8434 评论:0

从源码讲解 golang 内存分配

## 引言 golang 是谷歌2009年发布的开源编程语言,截止目前go的release版本已经到了1.12,Golang 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Golang 编译的程序可以媲美 C /C++代码的速度,而且更加安全、支持并行进程。和其他“高级语言”一样,golang同样有一套自己的内存管理机制,自主的去完成内存分配、垃圾回收、内存管理等过程,从而避免频繁的向操作系统申请、释放内存,有效的提升go语言的处理性能。由于篇幅有限,本文重点针对golang1....阅读全文

2019-08-11 01:00:24 polaris
阅读:4543 评论:3

golang连接mysql

```/* * @Descripttion: golang 连接mysql demo * @version: * @Author: weilin * @Date: 2019-10-19 11:31:23 * @LastEditors: weilin * @LastEditTime: 2019-10-19 22:49:53 */package mainimport ( // database/sql是golang的标准库之一,它提供了一系列接口方法,用于访问关系数据库。 //它并不会提供数据库特有...阅读全文

2019.10.21 09:24:02 aside section . 等
阅读:9746 评论:0

图解go反射实现原理

Go反射的实现和interface和unsafe.Pointer密切相关。如果对golang的interface底层实现还没有理解,可以去看我之前的文章:Go语言interface底层实现,unsafe.Pointer会在后续的文章中做介绍。 (本文目前使用的Go环境是Go 1.12.9) interface回顾 首先我们简单的回顾一下interface的结构,总体上是: 细分下来分为有函数的iface和无函数的eface(就是interface{}); 无函数的eface 有函数的iface ...阅读全文

2020年02月15日 RyuGou
阅读:1858 评论:0

golang 使用xorm操作mysql

xorm 官方介绍:xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。xorm支持两种风格的混用。 xorm还提供了工具,通过reverse命令根据数据库的表结构生成对应的struct,省去了人工组织代码的工作,十分方便。官方地址:https://xorm.io/中文文档:https://books.studygolang.com... 安装 ...阅读全文

2020-03-20 09:32:34 叶子
阅读:7535 评论:0

GoLang之使用Context控制请求超时

起因   之前接触了一个需求:提供一个接口,这个接口有一个超时时间,如果超时了返回超时异常;这个接口中调用其他的接口,如果调用超时了,所有请求全部结束。  在这个接口中,我使用了go协程去调用其他接口,所以不仅涉及到请求的超时控制,而且还涉及到父协程对子协程的控制问题。在翻阅了一些资料之后,了解到了Context的基本知识。 Context   Context是golang.org.pkg下的一个包,类型是接口类型。主要功能有 父协程控制所有的子协程   Context可以通过context.B...阅读全文

2020-04-06 10:32:34 MACdress
阅读:2891 评论:0

golang 生成个性二维码

前言 好久没发文章了,最近登录看到有朋友评论了golang生成二维码的文章,想了解下生成个性二维码的解决方案! 实现思路 ,网上搜相关资料几乎没有, 没有那就就自己想吧,就去看了下草料二维码; 然后突然就有感觉了 不就是把像素的颜色替换嘛 这还不简单 1 打开二维码图片2 打开要填充的图片3 将要填充的图片剪裁成和二维码一样大小4 分析二维码的每个像素 替换成图片的像素就行了 以下是生成的例子: 例子 代码 package main import ( "fmt" "github.com/nfnt...阅读全文

2020-05-14 18:32:34 李昊天
阅读:2587 评论:0

Go 与异步 IO - io_uring 的思考

> 本来准备写一篇详细关于 `io_uring` 的中文文章,不过在使用上官方的一些文章写的已经非常详细,简单的拿来[翻译](http://icebergu.com/archives/linux-iouring)感觉又失去了乐趣 于是便借鉴 [liburing](https://github.com/axboe/liburing),配合 Go 提供的并发机制实现了一个 golang 版本的异步 IO 库 —— [iouring-go](https://github.com/iceber/iou...阅读全文

2020-11-09 14:22:12 Iceber
阅读:1265 评论:0