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

golang中os包用法

os包中实现了平台无关的接口,设计向Unix风格,但是错误处理是go风格,当os包使用时,如果失败之后返回错误类型而不是错误数量. os包中函数设计方式和Unix类似,下面来看一下. func Chdir(dir string) error //chdir将当前工作目录更改为dir目录. func Getwd() (dir string, err error) //获取当前目录,类似linux中的pwd func Chmod(name string, mode FileMode) error //更改文件的权限(读写执行,分为三类:all-group-owner) func Chown(name string, uid, gid int) error //更改文件拥有者owner func ...阅读全文

博文 2015-10-18 12:00:05 chenbaoke

Go语言 unsafe的妙用

unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁。uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。uintptr和unsafe.Pointer的区别就是:unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算;而uintptr是用于指针运算的,GC 不把 uintptr 当指针,也就是说 uintptr 无法持有对象,uintptr类型的目标会被回收。golang的unsafe包很强大,基本上很少会去用它。它可以像C一样去操作内存,但由于golang不支持直接进行指针运算,所以用起来稍显麻烦。 切入正题。利用u...阅读全文

博文 2014-10-14 10:00:01 abv123456789

Golang,kafka实现消息推拉

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

博文 2019-01-25 14:34:47 Carrism

go文件操作函数

文件操作 golang的文件操作时在os包中的。 所以用的时候要import os包 包含以下的这些函数 func Create(name string) (file *File, err error) 直接通过纹面创建文件 func NewFile(fd uintptr, name string) *File func Open(name string) (file *File, err error) 以只读方式打开一个存在的文件,打开就可以读取了。 func OpenFile(name string, flag int, perm FileMode) (file *File, err error) ...阅读全文

golang 防知乎 中文验证码 源码

创,转载请注明出处! 最开始用图形来模仿文字进行各种角度的倒立和排列,后来切换为文字后,有很多问题。总结如下: 1、程序在画图形和画文字方面不一样,图形的是从原点开始(0,0),而文字则从文字的基线开始(0,baseline) 2、在增加角度偏移时,文字或图形的高宽会产生变化(偏∠45度时达到最大),这时候为了让它们顶点对齐,需要计算偏移量(用三角函数) 3、在绘图时,会先旋转“画布”(描述可能不准确),再绘制文字。此时要往回旋转,否则下一个图形会顺着这个角度继续画。 4、为了让图形保持固定宽度,对于有偏角的文字,需要平均缩小左右间距(否则不同的角度,固定的文字个数,会让图形宽度不同) 效果图: 源码:(代码还可以再整理和优化,但限于计划时间,懒得弄了) package main impor...阅读全文

博文 2018-07-16 15:30:00 Denny_Yang

golang的io包

package io import "io" io包提供了对I/O原语的基本接口。本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。 因为这些接口和原语是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发执行安全的。 Index Variables type Reader type Writer type Closer type Seeker type ReadCloser type ReadSeeker type WriteCloser type WriteSeeker type ReadWriter type ReadWriteCloser type Read...阅读全文

博文 2014-10-04 19:26:40 刘地

golang: 利用unsafe操作未导出变量

看了 @喻恒春 大神的利用unsafe.Pointer来突破私有成员,觉得例子举得不太好。而且不应该简单的放个demo,至少要讲一下其中的原理,让看的童鞋明白所以然。see:http://my.oschina.net/achun/blog/122540 unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁。uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。uintptr和unsafe.Pointer的区别就是:unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算;而uintptr是用于指针运算的,GC 不把 uin...阅读全文

博文 2014-10-04 19:26:58 陈一回

Go bytes包

Go bytes包 bytes包基本方法的使用 package main import ( "bytes" ) func writeUInt16(buff []byte, data uint16) { for i := 0; i < 2; i++ { buff[i] = byte(data >> uint(i*8)) } } func spilt(r rune) bool { if r == 'c' { return true } return false } func main() { println("hello world") buff1 := make([]byte, 2) // 创建一个切片 writeUInt16(buff1, uint16(12)) buff2 := make(...阅读全文

博文 2017-02-10 08:00:40 xxggy

Golang http.Request复用

针对除了Get以外的请求 package main import ( "net/http" "strings" ) func main(){ reader := strings.NewReader("hello") req,_ := http.NewRequest("POST","http://www.abc.com",reader) client := http.Client{} client.Do(req) // 第一次会请求成功 client.Do(req) // 请求失败 } 第二次请求会出错 http: ContentLength=5 with Body length 0 原因是第一次请求后req.Body已经读取到结束位置,所以第二次请求时无法再读取body, 解决方法:重新定义...阅读全文

博文 2019-01-17 11:34:47 dom_chan

[翻译]编译器(7)-扫描

文在此。 ————翻译分隔线———— 编译器(7)-扫描 第一部分:介绍 第二部分:编译、转译和解释 第三部分:编译器设计概览 第四部分:语言设计概述 第五部分:Calc 1 语言规格说明书 第六部分:标识符 现在终于可以开始在扫描器上工作了。 词法分析 那么,从哪里开始呢? 这是最难的一部分,对我来说,扫描看起来应该挺简单的,但是很快我就迷失在细节里。有许多种实现扫描器的方法,我只会向你展示其中的一种。这里是 Rob Pike 在一次演讲中的演示文稿,是关于另外一种很酷的方法:在 Go 中的词法扫描。 扫描器的基本原理就是从顶到底、从左到右、直到源代码的结尾进行检索。每次,发现所需要的元素,就报告词法串被找到,标识符会告诉解析器它是什么,以及找到它的位置。 有限状态机 我现在不会真正深入到...阅读全文

博文 2014-10-09 16:20:24 mikespook

GRPC状态码

使用grpc的时候,线上php客户端调用go服务端,出现2/5/14等状态码,没有做日志输出,导致问题查了很长时间,最终问题是因为连接没有close掉,连接数不够了。 grpc的状态码在google.golang.org/grpc/codes:codes中,整理下状态码的翻译: 0:Ok:返回成功 1:Canceled:操作已取消 2:Unknown:未知错误。如果从另一个地址空间接收到的状态值属 于在该地址空间中未知的错误空间,则可以返回此错误的示例。 没有返回足够的错误信息的API引发的错误也可能会转换为此错误 3:InvalidArgument:表示客户端指定了无效的参数。 请注意,这与FailedPrecondition不同。 它表示无论系统状态如何(例如格式错误的文件名)都有问题的...阅读全文

博文 2018-11-16 19:34:47 王先森QAQ

Go unsafe包

Go unsafe包 unsafe包概述 直到现在(Go1.7),unsafe包含以下资源: 三个函数: // unsafe.Sizeof函数返回操作数在内存中的字节大小,参数可以是任意类型的表达式,但是它并不会对表达式进行求值. // 一个Sizeof函数调用是一个对应uintptr类型的常量表达式, // 因此返回的结果可以用作数组类型的长度大小,或者用作计算其他的常量. func Sizeof(x ArbitraryType) uintptr //函数的参数必须是一个字段 x.f, 然后返回 f 字段相对于 x 起始地址的偏移量, 包括可能的空洞. func Offsetof(x ArbitraryType) uintptr //unsafe.Alignof 函数返回对应参数的类型需要...阅读全文

博文 2017-02-17 11:00:19 xxggy

Go io包

Go io包 Go io包的接口概览 io.Writer interface // Writer 接口包装了基本的 Write 方法,用于将数据存入自身。 // Write 方法用于将 p 中的数据写入到对象的数据流中, // 返回写入的字节数和遇到的错误。 // 如果 p 中的数据全部被写入,则 err 应该返回 nil。 // 如果 p 中的数据无法被全部写入,则 err 应该返回相应的错误信息。 type Writer interface { Write(p []byte) (n int, err error) } 我们可以通过查看标准库文档,列出实现了io.Reader或io.Writer接口的类型(导出的类型): os.File 同时实现了io.Reader和io.Writer s...阅读全文

博文 2017-02-12 12:00:25 xxggy

Golang 笔记之深入浮点数

引言下面的一段简单程序 0.3 + 0.6 结果是什么?1 var f1 float64 = 0.32 var f2 float64 = 0.63 fmt.Println(f1 + f2)有人会天真的认为是0.9,但实际输出却是0.8999999999999999(go 1.13.5)问题在于大多数小数表示成二进制之后是近似且无限的。以0.1为例。它可能是你能想到的最简单的十进制之一,但是二进制看起来却非常复杂:0.0001100110011001100…其是一串连续循环无限的数字(涉及到10进制转换为2进制,暂不介绍)。结果的荒诞性告诉我们,必须深入理解浮点数在计算机中的存储方式及其性质,才能正确处理数字的计算。golang 与其他很多语言(C、C++、Python…)一样,使用了IEEE...阅读全文

博文 2020-01-13 16:33:45 jonson_jackson

Go 性能优化技巧 8/10

尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足。只是某些时候,我们须对此做些变通,以提升性能。 为便于阅读,以下示例均做了最大程度精简。 ![reflect1](http://studygolang.qiniudn.com/160607/116ce59acc17ca3eb189fcf74dadca3b.jpg) 如果是 reflect.Type,可将其缓存,避免重复操作耗时。但 Value 显然不行,因为它和具体对象绑定,内部存储实例指针。换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个唯一属性。利用偏移量,将 FieldByName 变为普通指针操作,就可以实现性能提升。 ![reflect2...阅读全文

Golang同步:条件变量和锁组合使用

条件变量的作用并不是保证在同一时刻仅有一个线程访问某一个共享数据,而是在对应的共享数据的状态发生变化时,通知其他因此而被阻塞的线程。 条件变量与互斥量组合使用 互斥量为共享数据的访问提供互斥支持 条件变量就状态的变化向相关线程发出通知 三种操作方法 等待通知: wait 阻塞当前线程,直到收到该条件变量发来的通知 单发通知: signal 让该条件变量向至少一个正在等待它的通知的线程发送通知,表示共享数据的状态已经改变。 广播通知: broadcast 让条件变量给正在等待它的通知的所有线程都发送通知。 声明 func NewCond(l Locker) *Cond 示例 改造上一节的锁使用代码 Golang同步:锁的使用案例详解 传送门:http://blog.csdn.net/liuxi...阅读全文

博文 2016-01-19 14:00:01 grassroots2011

Go-unsafe详解

package unsafe // ArbitraryType is here for the purposes of documentation only and is not actually // part of the unsafe package. It represents the type of an arbitrary Go expression. type ArbitraryType int // Pointer represents a pointer to an arbitrary type. There are four special operations // available for ty...阅读全文

博文 2016-02-05 04:00:01 shuanger_

基于 MySQL 的 ID 生成器 idgo

idgo是一个利用MySQL批量生成ID的ID生成器, 主要有以下特点: * 每次通过事务批量取ID,性能较高,且不会对MySQL造成压力. * 当ID生成器服务崩溃后,可以继续生成有效ID,避免了ID回绕的风险. 业界已经有利于MySQL生成ID的方案,都是通过:

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
这种方式生成ID的弊端就是每生成一个ID都需要查询一下MySQL,当ID生成过快时会对MySQL造成很大的压力. 这正是我写这个lib库的原因...阅读全文

开源项目 2015-12-24 16:00:00 flike

用Golang写一个搜索引擎(0x02)--- 倒排索引技术

这一篇,我们来说说搜索引擎最核心的技术,倒排索引技术,倒排索引可能需要分成几篇文章才说得完,我们先会说说倒排索引的技术原理,然后会讲讲怎么用一些数据结构和算法来实现一个倒排索引,然后会说一个索引器怎么通过文档来生成一个倒排索引。 倒排索引 什么是倒排索引呢?索引我们都知道,就是为了能更快的找到文档的数据结构,比如给文档编个号,那么通过这个号就可以很快的找到某一篇文档,而倒排索引不是根据文档编号,而是通过文档中的某些个词而找到文档的索引结构。 倒排索引技术简单,高效,简直是为搜索引擎这种东西量身定做的,就是靠这个技术,实现一个搜索引擎才成为可能,我们也才能在海量的文章中通过一个关键词找到我们想要的内容。 我们看个例子,有下面的几个文档: 文档编号 文档内容 1 这是一个Go语言实现的搜索引擎 ...阅读全文

博文 2016-07-20 11:10:55 吴yh坚

golang利用reflect包实现struct与params自动绑定

前言 因为 golang 静态强类型语言特性以及没有很好的泛型支持导致在用 go 写 web 服务的时候,总会因为要对 http params 的解析和类型转换上要花很多时间,并且这会让代码显得很冗余,那有什么办法可以解决这一苦痛呢?答案当然是有的,这里我讲会到如何用 reflect 包写一个工具类实现 model 层 struct 与 http params 的自动映射绑定。 具体实现其实很简单,主要用到的就是通过 reflect.TypeOf() 获取字段的类型(包括字段名,类型,Tag描述等相关信息),以及 reflect.ValueOf() 来获取字段的值类型用于复写从params获取到的数据, 同时还要注意不同类型数值在 Set 时的差别。 用料 首先我们设计一个struct来储存...阅读全文

博文 2018-05-19 20:48:29 音風の部屋

Kafka 消费者滞后检查 Burrow

Burrow是一个基于Apache Kafka的监控助手,为消费者提供滞后检查作为服务,而不需要指定的阈值。它可以监视所有消费者提交的偏移,并计算这些消费者的需求状况。 **特性** * 没有阈值 * 多Kafka集群支持 * 支持配置 Zookeeper 提交的偏移 * 支持配置 Strom 提交的偏移 * 可配置的emailer用于发送警报到特定群体 * 可配置的HTTP 客户端用户为所有的用户组发送警报到其他系...阅读全文

Golang 笔记之深入浮点数

引言 下面的一段简单程序 0.3 + 0.6 结果是什么? var f1 float64 = 0.3 有人会天真的认为是0.9,但实际输出却是0.8999999999999999(go 1.13.5)问题在于大多数小数表示成二进制之后是近似且无限的。 以0.1为例。它可能是你能想到的最简单的十进制之一,但是二进制看起来却非常复杂:0.0001100110011001100… 其是一串连续循环无限的数字(涉及到10进制转换为2进制,暂不介绍)。 结果的荒诞性告诉我们,必须深入理解浮点数在计算机中的存储方式及其性质,才能正确处理数字的计算。 golang 与其他很多语言(C、C++、Python…)一样,使用了IEEE-754标准存储浮点数。 IEEE-754 如何存储浮点数 IEEE-754规...阅读全文

博文 2020-02-13 09:32:48 唯识相链2

golang中的unsafe详解

一、unsafe 作用 从golang的定义来看,unsafe 是类型安全的操作。顾名思义,它应该非常谨慎地使用; unsafe可能很危险,但也可能非常有用。例如,当使用系统调用和Go结构必须具有与C结构相同的内存布局时,您可能别无选择,只能使用unsafe。关于指针操作,在unsafe包官方定义里有四个描述: 任何类型的指针都可以被转化为Pointer Pointer可以被转化为任何类型的指针 uintptr可以被转化为Pointer Pointer可以被转化为uintptr 额外在加上一个规则:指向不同类型数据的指针,是无法直接相互转换的,必须借助unsafe.Pointer(类似于C的 void指针)代理一下再转换也就是利用上述的1,2规则。 举例: func Float64bits(...阅读全文

博文 2019-02-22 21:34:42 yushu1987

golang复习

1. 利用defer、recover来实现try...catch func Try(fun func(), handler func(interface{})) { defer func() { if err := recover(); err != nil { handler(err) } }() fun() } func main() { Try(func() { panic("foo") }, func(e interface{}) { print(e) }) } 2. 关于error的一个程序 error是一个类型,类似于string,error也可以定义自己的类型 package main import "errors" import "fmt" // By convention,...阅读全文

博文 2014-10-04 19:27:23 壬癸甲乙

聊一聊高并发高可用那些事 - Kafka篇

目录 为什么需要消息队列 1.异步 :一个下单流程,你需要扣积分,扣优惠卷,发短信等,有些耗时又不需要立即处理的事,可以丢到队列里异步处理。 2.削峰 :按平常的流量,服务器刚好可以正常负载。偶尔推出一个优惠活动时,请求量极速上升。由于服务器 Redis,MySQL 承受能力不一样,如果请求全部接收,服务器负载不了会导致宕机。加机器嘛,需要去调整配置,活动结束后用不到了,即麻烦又浪费。这时可以将请求放到队列里,按照服务器的能力去消费。 3.解耦 :一个订单流程,需要扣积分,优惠券,发短信等调用多个接口,出现问题时不好排查。像发短信有很多地方需要用到, 如果哪天修改了短信接口参数,用到的地方都得修改。这时可以将要发送的内容放到队列里,起一个服务去消费, 统一发送短信。 高吞吐、高可用 MQ 对...阅读全文

博文 2020-06-07 16:32:43 伟洪winnie

go语言 文件读写

文件读写相关的函数在os包中,因此需要先导入os包。 主要有以下几个函数 func Create(name string) (file *File, err error) 直接通过纹面创建文件 func NewFile(fd uintptr, name string) *File func Open(name string) (file *File, err error) 以只读方式打开一个存在的文件,打开就可以读取了。 func OpenFile(name string, flag int, perm FileMode) (file *File, err error) func Pipe() (r *File, w *File, err error) 管道 func (f *File) C...阅读全文

博文 2015-06-17 23:02:39 lichao_ustc

RocketMQ主从读写分离机制

微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 一般来说,选择主从备份实现高可用的架构中,都会具备读写分离机制,比如 MySql 读写分离,客户端可以向主从服务器读取数据,但客户写数据只能通过主服务器。 RocketMQ 的读写分离机制又跟上述描写的不太一致,RocketMQ 有属于自己的一套读写分离逻辑,它会判断主服务器的消息堆积量来决定消费者是否向从服务器拉取消息消费。 决定消费者是否向从服务器拉取消息消费的值存在 GetMessageResult 类中: org.apache.rocketmq.store.GetMessageResult: private boolean suggestPullingFromSlave = f...阅读全文

博文 2019-10-22 23:33:05 aside section._1OhGeD

Golang多线程读取千万级文件目录

package main import ( "fmt" "io" "os" ) func Exists(path string) bool { _, err := os.Stat(path) if err != nil { if os.IsExist(err) { return true } return false } return true } func appendToFile(f *os.File, content string) error { // 以只写的模式,打开文件 // 查找文件末尾的偏移量 n, _ := f.Seek(0, os.SEEK_END) // 从末尾的偏移量开始写入内容 _, err := f.WriteAt([]byte(content), n) ret...阅读全文

博文 2019-06-13 08:32:39 FredricZhu

Golang是否真的没有指针运算?

答案是肯定的: 没有指针运算(哈哈, 别着急慢慢往后面看) func main() { a1 := []int{1, 2, 3} p1 := &a1[0] fmt.Println(reflect.TypeOf(p1)) // *int fmt.Println("p1: ", *p1) // 1 fmt.Printf("p1 address:%p\n", p1) // 0xc00009a000 p1 = p1 + 1 } invalid operation: p1 + 1 (mismatched types *int and int) C或者C++转golang同学就高兴了, 再也不用面试的时候去面对下面这道题了(面试C++的时候, 基本每家公司的笔试题上都会有这道题) #include阅读全文

博文 2019-07-23 21:32:40 haohongfan

[翻译]编译器(7)-扫描

文在此。 ————翻译分隔线———— 编译器(7)-扫描 第一部分:介绍 第二部分:编译、转译和解释 第三部分:编译器设计概览 第四部分:语言设计概述 第五部分:Calc 1 语言规格说明书 第六部分:标识符 现在终于可以开始在扫描器上工作了。 词法分析 那么,从哪里开始呢? 这是最难的一部分,对我来说,扫描看起来应该挺简单的,但是很快我就迷失在细节里。有许多种实现扫描器的方法,我只会向你展示其中的一种。这里是 Rob Pike 在一次演讲中的演示文稿,是关于另外一种很酷的方法:在 Go 中的词法扫描。 扫描器的基本原理就是从顶到底、从左到右、直到源代码的结尾进行检索。每次,发现所需要的元素,就报告词法串被找到,标识符会告诉解析器它是什么,以及找到它的位置。 有限状态机 我现在不会真正深入到...阅读全文

博文 2017-01-07 11:00:13 mikespook

golang: 利用unsafe操作未导出变量-Pointer使用

unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁。uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。uintptr和unsafe.Pointer的区别就是:unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算;而uintptr是用于指针运算的,GC 不把 uintptr 当指针,也就是说 uintptr 无法持有对象,uintptr类型的目标会被回收。golang的unsafe包很强大,基本上很少会去用它。它可以像C一样去操作内存,但由于golang不支持直接进行指针运算,所以用起来稍显麻烦。 切入正题。利用u...阅读全文

博文 2018-08-05 16:34:56 豆瓣奶茶

NSQ 源码阅读 (四) diskqueue 文件读写

引言 我们在这个系列第一篇文章中提到过,如果需要消息落地而对存储子系统的选择上,从速度上来说 文件系统>分布式KV(持久化)>分布式文件系统>数据库。而NSQ选择了文件系统作为存储子系统。这篇文章将重点介绍nsq 对于文件的操作。 何时写入文件? 在内存的msg chan buffer 已满的时候,会将msg 写入文件,代码如下: func (c *Channel) put(m *Message) error { select { case c.memoryMsgChan <- m: default: b := bufferPoolGet() err := writeMessageToBackend(b, m, c.backend) bufferPoolPut(b) c.ctx.nsqd.S...阅读全文

博文 2017-09-19 15:34:45 buptztd

golang中的内存对齐和unsafe初探

unsafe 包简单说明 unsafe,顾名思义,是不安全的,Go定义这个包名也是这个意思,让我们尽可能的不要使用它,如果你使用它,看到了这个名字,也会想到尽可能的不要使用它,或者更小心的使用它。 使用unsafe包的同时也放弃了Go语言保证与未来版本的兼容性的承诺,因为它必然会有意无意中使用很多非公开的实现细节,而这些实现的细节在未来的Go语言中很可能会被改变。 unsafe包被广泛地用于比较低级的包, 例如runtime、os、syscall还有net包等,因为它们需要和操作系统密切配合,但是对于普通的程序一般是不需要使用unsafe包的。 虽然这个包不安全,但是它也有它的优势,那就是可以绕过Go的内存安全机制,直接对内存进行读写,所以有时候因为性能的需要,会冒一些风险使用该包,对内存进...阅读全文

博文 2019-04-11 12:34:41 Gopherzhang

日志内容按日期筛选工具date-filter

用于筛选当前时间到之前指定的范围内的日志内容的小工具,支持对php慢查询日志等多行日志文件的筛选。 上例中会输出发生时间在当前时间1分钟以内的日志。 日期格式使用Go语言标准的日期时间表示方法。 ![image](https://static.oschina.net/uploads/space/2017/0120/111920_Gvma_2896879.png) 例如 `-layout '2006-01-02 15:04:05'` `-layout '2006-01-02T15:04:05'` `-layout '02-Jan-2006 15:04:05'` 目前只支持固定时间偏移位置的方式获取时间。`o...阅读全文

开源项目 2017-02-07 04:00:07 mylxsw

Twitter snowflake ID 算法之 golang 实现

是什么? snowflake ID 算法是 twitter 使用的唯一 ID 生成算法,为了满足 Twitter 每秒上万条消息的请求,使每条消息有唯一、有一定顺序的 ID ,且支持分布式生成。 主要解决了高并发时 ID 生成不重复的问题 结构 snowflake ID 的结构是一个 64 bit 的 int 型数据。 如图所示 : 1 bit:不使用,可以是 1 或 0 41 bit:记录时间戳 (当前时间戳减去用户设置的初始时间,毫秒表示),可记录最多 69 年的时间戳数据 10 bit:用来记录分布式节点 ID,一般每台机器一个唯一 ID,也可以多进程每个进程一个唯一 ID,最大可部署 1024 个节点 12 bit:序列号,用来记录不同 ID 同一毫秒时的序列号,最多可生成 4096...阅读全文

golang之redis入门: string

package main import ( "fmt" "github.com/garyburd/redigo/redis" ) /* redis操作之 string exists 检查是否存在某个key set key value ex time 键 值 过期模式 时间 eg: 127.0.0.1:6379> set a 444 ex 10 setnx key value 只有key不存在的情况下,将key的值设置为value eg: 127.0.0.1:6379> setnx a 333 (integer) 1 127.0.0.1:6379> get a "333" setex key seconds value 将key的值设置为value 并将key的生存时间设置为seconds秒 ...阅读全文

博文 2019-06-27 20:02:42 五知小白羊

(十四)golang unsafe.Pointer

golang 的指针 Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确类型的对象,进行严格类型检查 package main import ( "fmt" ) func main() { u := string(32) i := int32(1) fmt.Println(&u, &i) // 打印出地址 p := &i // p 的类型是 *int32 p := &u // &u的类型是 *string,于 p 的类型不同,不能赋值 会报错 p := (*string)(&u) // 这种类型强制转换也是无效的 会报错 fmt.Println(p) } 针对刚刚的问题,我们可以采用 unsafe 标准库来解决。在官方的诠释中,有如下概述: 围绕 ...阅读全文

博文 2019-07-01 20:32:58 杰克慢

Go Assembly Programming

源自 Plan9 汇编实现。 保存在 .s 文件中,编译器自动编译、链接。本文内容基于 amd64 架构。指令指令参数长度。MOVB: 1-byte MOVW: 2 MOVL: 4 MOVQ: 8 数据移动方向:从左往右。 ADD R1, R2 // R2 += R1 SUB R3, R4 // R4 -= R3 SUB R3, R4, R5 // R5 = R4 - R3 MUL $7, R6 // R6 *= 7 内存访问。 MOV (R1), R2 // R2 = *R1 MOV 8(R1), R2 // R2 = *(8 + R2) MOV 16(R1)(R2*2), R3 // R3 = *(16 + R1 + R2*2) MOV runtime·x(SB), R2 // R2 =...阅读全文

博文 2017-07-10 06:24:13 polaris

新手求教一个远程文件下载的问题

用网上别人写的Get 函数 ``` func Get(url string) (content string, statusCode int) { resp, err1 := http.Get(url) if err1 != nil { statusCode = -100 return } defer resp.Body.Close() data, err2 := ioutil.ReadAll(resp.Body) if err2 != nil { statusCode = -200 return } statusCode = resp.StatusCode content = string(data) return } ...阅读全文

Go的内存对齐和指针运算详解和实践

#### uintptr 和 unsafe普及 ##### uintptr 在Go的源码中uintptr的定义如下: ```go /* uintptr is an integer type that is large enough to hold the bit pattern of any pointer. 从英文注释可以看出 uintptr是一个整形,它的大小能够容纳任何指针的位模式,它是无符号的,最大值为:18446744073709551615,怎么来的,int64最大值 * 2 +1 */ type uintptr uintptr ``` **位模式**:内存由字节组成.每个字节由8位bit组成,每个bit状态只能是0或1.所谓位模式,就是变量所占用内存的所有bit的状态的序列 *...阅读全文

博文 2020-01-06 09:12:06 SunPengWei

文件断点续传的基本实现

断点续传原理 每次拷贝时,使用seek记录偏移量,并将其记录在本地文件中,下次拷贝时读取时从记录的偏移量的位置继续进行 上次上传代码有错误,已修复 代码实现 核心方法 func ContinueCopy(srcFile, destDir string) (int, error) { // 1. 定义源文件 fileSrc, err := os.Open(srcFile) if err != nil { return 0, err } log.Printf("源文件名称:%s\n", fileSrc.Name()) // 2. 定义目标文件位置,不存在时自动创建 destFile := destDir + srcFile[strings.LastIndex(srcFile, "/")+1:] ...阅读全文

博文 2020-01-19 12:34:20 永动的图灵机

Golang内存对齐

如何得到一个对象所占内存大小? fmt.Println(unsafe.Sizeof(int64(0))) // "8" type SizeOfA struct { A int } unsafe.Sizeof(SizeOfA{0}) // 8 type SizeOfC struct { A byte // 1字节 C int32 // 4字节 } unsafe.Sizeof(SizeOfC{0, 0}) // 8 unsafe.Alignof(SizeOfC{0, 0}) // 4 结构体中A byte占1字节,C int32占4字节. SizeOfC占8字节 内存对齐: 为何会有内存对齐?1.并不是所有硬件平台都能访问任意地址上的任意数据。2.性能原因 访问未对齐的内存,处理器需要做两次内存...阅读全文

Go:边界检查确保内存安全

![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200304-Go-Memory-Safety-with-Bounds-Check/cover.png) ℹ️*这篇文章基于 Go 1.13 编写。* Go 的一系列内存管理手段(内存分配,垃圾回收,内存访问检查)使许多开发者的开发工作变得很轻松。编译器通过在代码中引入“边界检查” 来确保安全地访问内存。 ## 生成的指令 Go 引入了一些控制点...阅读全文

博文 2020-05-05 20:18:29 yxlimo

Golang Map实现(一)

本文学习 Golang 的 Map 数据结构,以及map buckets 的数据组织结构。 hash 表是什么 从大学的课本里面,我们学到:hash 表其实就是将key 通过hash算法映射到数组的某个位置,然后把对应的val存放起来。如果出现了hash冲突(也就是说,不同的key被映射到了相同的位置上时),就需要解决hash冲突。解决hash冲突的方法还是比较多的,比如说开放定址法,再哈希法,链地址法,公共溢出区等(复习下大学的基本知识)。 其中链地址法比较常见,下面是一个链地址法的常见模式: golang_hash_1_common.jpg Position 指通过Key 计算出的数组偏移量。例如当 Position = 6 的位置已经填满KV后,再次插入一条相同Position的数据将...阅读全文

博文 2020-04-26 10:32:44 搬砖程序员带你飞

Go语言学习笔记--unsafe.Pointer 和 uintptr

载原文: https://blog.csdn.net/cbmljs/article/details/82983639 这里有一些关于unsafe.Pointer和uintptr的事实: uintptr是一个整数类型。 即使uintptr变量仍然有效,由uintptr变量表示的地址处的数据也可能被GC回收。 unsafe.Pointer是一个指针类型。 但是unsafe.Pointer值不能被取消引用。 如果unsafe.Pointer变量仍然有效,则由unsafe.Pointer变量表示的地址处的数据不会被GC回收。 unsafe.Pointer是一个通用的指针类型,就像* int等。 由于uintptr是一个整数类型,uintptr值可以进行算术运算。 所以通过使用uintptr和unsa...阅读全文

博文 2019-07-14 15:32:38 hament

golang利用reflect包实现struct与params自动绑定

前言 因为 golang 静态强类型语言特性以及没有很好的泛型支持导致在用 go 写 web 服务的时候,总会因为要对 http params 的解析和类型转换上要花很多时间,并且这会让代码显得很冗余,那有什么办法可以解决这一苦痛呢?答案当然是有的,这里我讲会到如何用 reflect 包写一个工具类实现 model 层 struct 与 http params 的自动映射绑定。 具体实现其实很简单,主要用到的就是通过 reflect.TypeOf() 获取字段的类型(包括字段名,类型,Tag描述等相关信息),以及 reflect.ValueOf() 来获取字段的值类型用于复写从params获取到的数据, 同时还要注意不同类型数值在 Set 时的差别。 用料 首先我们设计一个struct来储存...阅读全文

博文 2018-05-21 00:33:05 大糊涂

结合 Go 读 APUE-文件共享

文件共享 UNIX 系统支持在不同进程间共享打开文件, 知识点:内核用于所有 I/O 的数据结构、原子操作。 概念性的 I/O 数据结构 内核用于所有 I/O 的数据结构,只是个概念性的,不一定适用,有个大体的轮廓就 OK。 进程表 (process table entry) 中的记录 文件表项 (file table entry) v节点表项 (v-node table entry) 这是一个 打开文件的内核数据结构 图。打开文件 这个操作是一个进程, 每个进程在进程表中都有一个记录,而 打开文件进程记录 中包含一张打开文件描述符表, 包括: 文件描述符标志 指向一个文件表项的指针 文件描述符表用 Go 抽象如下表示: type fd struct { flags int pointer ...阅读全文

博文 2017-11-10 13:04:12 zhaohuXing

ARTS 第5周

ARTS 第4周分享 [TOC] Algorithm 1021. Remove Outermost Parentheses 难度:[easy] [思路] 先解析成最原始的括号 遍历这个字符串, 用一个int变量flag标记是否匹配成一个原始括号:如果为左括号,flag加1;如果为右括号,flag减1;如果flag为零,则匹配成一个原始括号 用一个切片[]byte存储遍历的每一个字符,直到flag为0时,将这个切片存入另一个[][]byte切片中 再删除最外层的括号 遍历这个切片[][]byte, 将其中每一个[]byte切片进行[:],然后拼接成一个整体 [参考代码] func removeOuterParentheses(S string) string { flag := 0 tempB...阅读全文

博文 2019-04-27 23:34:41 陈卧虫

在 Go 中恰到好处的内存对齐

在 Go 中恰到好处的内存对齐 问题 type Part1 struct { a bool b int32 c int8 d int64 e byte } 在开始之前,希望你计算一下 Part1 共占用的大小是多少呢? func main() { fmt.Printf("bool size: %d\n", unsafe.Sizeof(bool(true))) fmt.Printf("int32 size: %d\n", unsafe.Sizeof(int32(0))) fmt.Printf("int8 size: %d\n", unsafe.Sizeof(int8(0))) fmt.Printf("int64 size: %d\n", unsafe.Sizeof(int64(0))) fmt...阅读全文

博文 2019-06-04 16:29:40 EDDYCJY