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

在 Golang 中使用 -w 和 -s 标志

今天的博客文章来自 Valery,这是 [Spiral Scout](https://spiralscout.com/) 的一名高级软件工程师,专门从事 Golang(Go)开发。 作为在 Golang 以及许多其他编程语言方面具有专业知识的软件开发机构,我们知道对于我们的工程师和质量保证专家而言,能够与社区分享他们的知识和经验非常重要。 感谢 Valery 这篇出色的文章和有用的 Golang 测试技巧! 当我在 GitHub 上查找一些良好的工程实践以备应用时,我注意到许多开发人员编译他们的 Go 程序时经常出现的问题,他们中许多人都使用链接器标记(linker flags)来减小输出文件大小,尤其是同时使用 `-w` 和 `-s` 标记所带来的叠加效果。 在软件测试中,标记也被称为参数...阅读全文

博文 2020-01-08 17:43:13 befovy

go 链表反

链表操作是数据结构中基本的操作,下面用golang实现一下链表的基本操作,包括增、删、查以及单链表的反转操作。package linkimport ( "fmt" "github.com/pkg/errors")//链表结构type ListNode struct { data int next *ListNode}//初始化链表头,下面的所有操作都是基于带头链表func NewListNode() *ListNode { return &ListNode{next: nil}}//获取链表的长度func (l *ListNode)Length() int { len :=0 for l.next != nil { len++ l = l.next } return len}//插入节点fu...阅读全文

博文 2018-10-15 12:34:41 GoSnail

深入理解go的slice和到底什么时候该用slice

# 深入理解go的slice和到底什么时候该用slice ## 前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 ## 先了解一下slice的特性 * 定义一个slice ```go s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] ``` 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。...阅读全文

golang 分页

工具包tools/paging.go package tools import ( "math" ) func CreatePaging(page, pagesize, total int64) *Paging { if page < 1 { page = 1 } if pagesize < 1 { pagesize = 10 } page_count := math.Ceil(float64(total) / float64(pagesize)) paging := new(Paging) paging.Page = page paging.Pagesize = pagesize paging.Total = total paging.PageCount = int64(page_coun...阅读全文

博文 2018-04-24 17:33:06 别人说我名字很长

go语言内存分配之TCMalloc

tcmalloc tcmalloc 优点 速度更快,比glicbc 2.3 快 占用更少的内存空间,8倍8-byte的对象内存分配中占用大约8N*1.01byte的头空间,而ptmalloc则会占用16N*byte的头空间 使用 在程序中只需使用“-ltmalloc”连接标识将其链接到程序中 综述 TCMalloc为每一个线程分配本地缓存,以满足小对象分配的需求,当需要时候,对象从中央数据结构移动到本地缓存,周期性的垃圾回收则将内存从各个线程的本地缓存收回中央数据结构。 小对象分配 每个小对象映射到170个不同的大小空间。每个空间间隔8byte,0-8byte(8),8-24byte(16),24-48byte(24),最大间隔为256byte。大对象和小对象的界限为32kb。每个线程的缓存...阅读全文

博文 2016-04-16 19:00:02 tanghui_lin

编译更小的 Golang 程序

go build -ldflags "-s -w" x.go (go install类似) -s 去掉符号表,然后 panic 的时候 stack trace 就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果。不推荐使用。 -w 去掉 DWARF 调试信息,得到的程序就不能用 gdb 调试了,如果不打算用 gdb 调试,基本没啥损失。 示例: # go build main.go && ls -l main -rwxr-xr-x 1 Bing.L Bing.L 15054336 Nov 4 08:39 main # go build -ldflags "-s -w" main.go && ls -l main -rwxr-xr-x 1 Bing.L Bing.L ...阅读全文

博文 2014-11-05 03:00:01 bing-l

Linux下64 位 预编译 的 go 1.6.2 安装

go 安装 - 1.6.2 OS: Linux, 64位, readhat 7.2 使用官网预编译gz包安装 1. 网址 https://golang.org/ 目前版本 1.6.2 下载页 https://golang.org/dl/ https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz 2. 解压缩 go要求ROOT 目录在 /usr/local 下,解压命令: [root@ip-172-30-0-110 home]# tar -C /usr/local -xf go1.6.2.linux-amd64.tar.gz [root@ip-172-30-0-110 home]# ls /usr/local/ bin e...阅读全文

博文 2016-06-11 20:00:01 XuYongshi02

Go Hashmap内存布局和实现

想了解Go内置类型的内存布局的契机,是一次在调试“不同类型的小对象频繁创建对gc性能的影响”时发现map的gc性能不佳,而作为对比的包含slice的struct却很好。这里总结Go runtime里map的实现,可以解释这个问题。 hash table内部结构Go的map就是hashmap,源码在src/runtime/hashmap.go。对比C++用红黑树实现的map,Go的map是unordered map,即无法对key值排序遍历。跟传统的hashmap的实现方法一样,它通过一个buckets数组实现,所有元素被hash到数组的bucket中,buckets就是指向了这个内存连续分配的数组。B字段说明hash表大小是2的指数,即2^B。每次扩容会增加到上次大小的两倍,即2^(B+1)...阅读全文

博文 2017-12-18 13:58:29 nino's blog

双向链表的GO语言实现

一、什么是双向链表​和单链表比较,双向链表的元素不但知道自己的下线,还知道自己的上线(越来越像传销组织了)。小煤车开起来,图里面可以看出,每个车厢除了一个指向后面车厢的箭头外,还有一个指向前面车厢的箭头(车头、车尾除外)。车头只有指向后面车厢的箭头,车尾只有指向前面车厢的箭头。二、双向链表与Go的对应结构1、节点​我们先把车厢分解开来。每节车厢都由煤炭、车体、拉前车厢绳索、拉后车厢绳索这4部分组成。车体是我们的运输工具,在Go语言里我们用结构提DNode表示;煤炭代表运的货物,用data变量表示;拉前车厢绳索和拉后车厢绳索我们分别用指针prev和next表示。这样一节车厢,用Go语言描述如下:type DNode struct { data Object prev *DNode next *...阅读全文

博文 2017-11-10 03:13:55 rhan-zz

BookStack V1.3 发布,新增书签和阅读进度等功能

BookStack,分享知识,共享智慧!知识,因分享,传承久远! BookStack 是基于[Mindoc](https://gitee.com/longfei6671/godoc)开发的,为运营而生,可用于文档项目管理,也可用于开源书籍的整理并提供用户阅读,支持批量创建文档、markdown项目一键导入以及文章采集等强大便捷的功能。 本次更新,新增了数据表,旧版本用户,直接执行`./BookStack install`操作,对数据库表进行升级(不会影响原有表数据和结构)。 ## 升级日志 1\. 新增:用户阅读记录和阅读进度 ![](http://static.bookstack.cn/projects/help/15307a02c0874190.pn...阅读全文

golang的reflect

编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的,只要包含这个包就可以使用。 Golang的gRPC,json包都是通过反射实现的。 interface 和 反射 interface的wiki计划整理到这里: golang的interface golang的变量分为两部分,type和va...阅读全文

博文 2019-03-11 19:34:46 黑魔术师

history.back()和history.go()的区别

Javascript:history.go()和history.back()的用法和区别 go(-1): 返回上一页,原页面表单中的内容会丢失;history.go(-1):后退+刷新;history.go(1) :前进 back(): 返回上一页,原页表表单中的内容会保留; history.back():后退 ; history.back(0) 刷新; history.back(1):前进 不同的浏览器的后退行为也是有区别的,而区别就跟Javascript:history.go()和history.back()的区别类似。 chrome和ff浏览器后退页面,会刷新后退的页面,若有数据请求也会提交数据申请。类似于 history.go(-1) 而safari(包括桌面版和ipad版本)的后退...阅读全文

博文 2016-09-11 17:00:01 yuan1013922969

《Go源码解读篇》之常见数据结构(list)

本打算用Go实现Java中常见的集合,简单实现ArrayList后,之后翻官网的package,发现了container/list,发现其实现十分的简洁,所以学习记录如下: List实现准备工作 如果想实现一个list,首先想到解决问题: 数据类型怎么处理? Go中有没有像Java中Object似的,万能的数据类型呢? 多亏Go中存在interface{}这样万能的数据类型,问题就迎刃而解啦! 来看看我的ArrayList实现设计: type ArrayList struct { size int32 data []interface{} } 我利用slice来实现简单的list(单向链表)操作,再看看官网的实现: type Element struct { prev, next *Elem...阅读全文

博文 2017-09-01 13:23:31 x_zhaohu

gf框架之路由控制 - 强大、灵活、高效

文章来源:http://gf.johng.cn/494375 gf框架提供了自建的非常强大的路由控制功能,支持流行的命名匹配规则及模糊匹配规则,并提供了优秀的优先级管理机制。以下是一个服务注册中使用路由控制的示例: package main import "gitee.com/johng/gf/g/net/ghttp" func main() { s := ghttp.GetServer() s.BindHandler("/:name", func(r *ghttp.Request){ r.Response.Writeln("pattern: /:name match") r.Response.Writeln(r.Get("name")) }) s.BindHandler("/:name/:...阅读全文

博文 2018-04-16 14:34:42 John

弄懂goroutine调度原理

[原文地址:https://bingjian-zhu.github.io/2019/09/12/%E5%BC%84%E6%87%82goroutine%E8%B0%83%E5%BA%A6%E5%8E%9F%E7%90%86/](https://bingjian-zhu.github.io/2019/09/12/%E5%BC%84%E6%87%82goroutine%E8%B0%83%E5%BA%A6%E5%8E%9F%E7%90%86/) ### goroutine简介 >golang语言作者Rob Pike说,**“Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法。一个运行的程序由一个或更多个goroutine组成。它与线程、协程、进程等不同。它是...阅读全文

博文 2019-09-12 19:35:26 939496716

内部排序算法(Golang版本)

package main import ( "fmt" ) func main() { //保存需要排序的Slice arr := []int{9, 3, 4, 7, 2, 1, 0, 11, 12, 11, 13, 4, 7, 2, 1, 0, 11, 12, 11} //实际用于排序的Slice list := make([]int, len(arr)) copy(list, arr) BubbleSortX(list) fmt.Println("冒泡排序:\t", list) copy(list, arr) QuickSort(list, 0, len(arr)-1) fmt.Println("快速排序:\t", list) copy(list, arr) //将arr的数据覆盖到li...阅读全文

博文 2015-11-23 03:00:00 achst

参考leveldb的cache实现

前言 对LevelDB比较了解应该知道其中一块cache实现:LRU Cache是采用双向链表 + HashTable,其中HashTable是为了解决双向链表的查找性能缺陷才引入的。接下来看一下采用golang如何实现LRU Cache。 实现 1、定义cache接口【thread-safe的cache】 import ( "io" ) // 参考:https://sourcegraph.com/github.com/google/leveldb/-/blob/include/leveldb/cache.h type Cache interface{ // 在multiple clients下共享相同的cache来划分key空间 // 当启动是会被分配一个新id NewId() uint6...阅读全文

博文 2018-09-26 18:34:44 一只躺在夕阳下的koala

Go语言map底层实现

``map``是Go语言中基础的数据结构,在日常的使用中经常被用到。但是它底层是如何实现的呢? Golang中``map``的底层实现是一个散列表,因此实现``map``的过程实际上就是实现散表的过程。在这个散列表中,主要出现的结构体有两个,一个叫``hmap``(``a header for a go map``),一个叫``bmap``(``a bucket for a Go map``,通常叫其``bucket``)。这两种结构的样子分别如下所示: hmap: 图中有很多字段,但是便于理解...阅读全文

博文 2018-08-26 02:58:20 RyuGou

golang 调用 cgo coredump 获得方法

写一个错误的c程序 package dlsym import "testing" func Test_intercept(t *testing.T) { Intercept("gethostbyname\x00") } package dlsym // #cgo CFLAGS: -I. // #include // #include "dlsym_wrapper.h" import "C" import "unsafe" func Intercept(symbol string) { ptr := unsafe.Pointer(&([]byte(symbol)[0])) C.intercept((*C.char)(ptr), C.size_t(len(symbol)))...阅读全文

博文 2017-02-10 10:29:10 taowen

Golang 开发企业级资源权限管理【第一步表设计】

我们做企业级系统,权限控制主要分三类。 【功能权限】:对菜单栏目进行权限控制,查询,增加,删除,修改功能,一般来说这种对资源的权限控制模型可以做到比较统一(用户、角色、资源)。 【数据权限】:哪些人能看到哪些数据,例如淘宝本人只能看自己订单,北京地区部门领导可以看到电器类部门订单, 最高领导能看到人所有订单等等。 这种跟业务高度相关,(网络上资料暂时比较少)原理主要是对SQL语句添加where 条件 【字段权限】:订单能看到哪些字段,如供应商,看不到内部价、 出厂价等信息。 (网络上资料暂时比较少)实现原理跟数据权限控制是一致的。对SQL语句添加select 条件 这次,我们主要讲解最常用的功能权限控制的实现过程,这类WEB权限控制,在任意后端语言上都可以实现Java、Golang、PHP、...阅读全文

博文 2019-10-14 10:32:56 aside section ._1OhGeD

Golang Map 实现 (二) map 的创建

本文在golang map 数据结构的基础上,学习一个make 是如何构造的。 map 创建示例 在golang 中,初始化一个map 算是有两种方式。 example1Map := make(map[int64]string) example2Map := make(map[int64]string, 100) 第一种方式默认不指定map的容量,第二种会指定后续map的容量估计为100,希望在创建的时候把空间就分配好。 当make创建map时,底层做了什么 对于不同的初始化方式,会使用不同的方式。下面是提供的几种初始化方法: // hint 就是 make 初始化map 的第二个参数 func makemap(t *maptype, hint int, h *hmap) *hmap fun...阅读全文

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

静态博客生成器CHCA

一个使用 golang 开发的博客生成器。 chca init 用于初始化博客,会自动生成config.yml 初始化以后需要在config.yml文件同目录下创建theme文件夹用于存放模板文件 模板文件夹结构 blog 模版文件夹 -- assets 资源文件夹 -- -- css -- -- js -- layout 布局文件夹 -- -- main.html 公共布局 -- -- index.html 主页 -- -- post.html 文章页 -- -- archive.html 导航导航页 -- -- category.html 分类导航页 -- -- tag.html 标签导航页 -- -- page.html 标签、导航和分类列表页面 新建m...阅读全文

Go语言二分之查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。算法要求:1.必须采用顺序存储结构。2.必须按关键字大小有序排列。要求:请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存 在此数,并且求出下标,如果没有就 ...阅读全文

博文 2019-03-11 20:35:22 GoDevops

golang内存分配

golang内存分配 new一个对象的时候,入口函数是malloc.go中的newobject函数 func newobject(typ *_type) unsafe.Pointer { flags := uint32(0) if typ.kind&kindNoPointers != 0 { flags |= flagNoScan } return mallocgc(uintptr(typ.size), typ, flags) } 这个函数先计算出传入参数的大小,然后调用mallocgc函数,这个函数三个参数,第一个参数是对象类型大小,第二个参数是对象类型,第三个参数是malloc的标志位,这个标志位有两位,一个标志位代表GC不需要扫描这个对象,另一个标志位说明这个对象并不是空内存 cons...阅读全文

博文 2016-01-22 03:00:00 yjf512

我希望的Golang的feature

如果有下面的功能,Go可以让程序员更高效。 1. 数学类型的自动转换。现在做个整数跟浮点数的计算也要手动转类型。据说是为了更安全和可预测的代码。但是其他主流语言都支持自动转,大家早就习惯了。需要考虑类型安全的地方,该考虑的人自然会去考虑。 2. Polymorphism的支持。interface对多态的支持还是比较有限。down casting做不了有的时候还是不大方便。比如下面这段代码就编不过 type Base struct { xxxx } type Derived struct { Base } func main() { v1 := &Drived{} var v2 *Base v2 = v1 //编译不过 v2 = *Base(v1) //也不行 } 3. 更方便的数组的操作比如...阅读全文

博文 2015-12-28 00:00:00 kefeng_chen

Go 1.3 正式发布,支持谷歌 NaCL

Google今天发布了Go语言1.3版本。新的版本改进了一些功能,支持在新环境中运行,显著改进链接器和编译器等,提供了更好的性能。目前,用户可以下载安装了。 主要改进包括: Godoc,Go文档服务器,目前支持静态分析;支持查看文档包、资源视图功能,查看文档细节; 支持Native Client(NaCL)虚拟机架构; 支持平台包括:DragonFly BSD、 Plan 9、 Solaris操作系统,查看安装资源; Go编译器生成二进制代码的性能得到了改善;提升垃圾回收机制;一种新的“ contiguous”堆栈管理策略;更快的race detector(数据检测)以及改进正则表达式处理程序。 显著改进链接器和编译器,可以更快地编译程序。 下载页:http://golang.org/dl/...阅读全文

博文 2014-10-09 16:00:05 newer7

golang中container/list包

list包实现了双向链表的功能。 type Element func (e *Element) Next() *Element func (e *Element) Prev() *Element type List func New() *List func (l *List) Back() *Element func (l *List) Front() *Element func (l *List) Init() *List func (l *List) InsertAfter(value interface{}, mark *Element) *Element func (l *List) InsertBefore(value interface{}, mark *Element) *E...阅读全文

博文 2018-12-07 21:34:42 laijh

从golang的垃圾回收说起(上篇)

本文来自网易云社区1 垃圾回收中的重要概念1.1 定义In computer science, garbage collection (GC) is a form of automatic memory management. The garbage collector, or just collector, attempts to reclaim garbage, or memory occupied by objects that are no longer in use by the program. Garbage collection was invented by John McCarthy around 1959 to simplify manual memory manage...阅读全文

博文 2018-08-28 21:30:00 163yun

golang如何让编译生产的二进制文件变小

把Go程序变小的办法是: go build -ldflags "-s -w" (go install类似) -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了, 这个等价于普通C/C++程序被strip的效果), -w去掉DWARF调试信息,得到的程序就不能用gdb调试了。 比如,server.go是一个简单的http server,用了net/http包。 $ go build server.go $ ls -l server -rwxr-xr-x 1 minux staff 4507004 2012-10-25 14:16 server $ go build -ldflags "-s -w" server.go $ ls -l server -rwxr...阅读全文

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

Golang从入门到精通

课程概述Golang从入门到精通,本课程以学习Golang语言开发互联网产品为目标,从基础理论知识入手,详实地讲解Golang语言的开发方法与技巧,并通过大量的线上训练,带领同学们全面掌握服务端高并发、过载保护、水平扩展、服务降级、服务限流以及微服务等主流互联网产品的开发技术栈,快速达到大公司工作两年的技术水平。章节1:Golang环境搭建课时1课程介绍10:08课时2Go的发展历史02:08课时3Go开发环境搭建09:18课时4Go目录结构介绍04:13课时5hello world程序演示16:56课时6Go常用命令介绍09:36课时7Go语言特性13:25章节2:数据类型课时8标识符和关键字04:44课时9变量介绍08:19课时10常量介绍14:21课时11常量练习03:26课时12数据...阅读全文

博文 2019-03-26 19:34:42 瑛子_1791198045

【Golang】如何统一处理HTTP请求中的异常捕获

最近写GOLANG项目,不使用框架,路由选择httprouter 现在想实现一个需求:在不修改httprouter源码的前提下,对所有注册的路由handle进行异常捕获。 大家都知道golang使用panic()产生异常,然后可以recover()来捕获到异常,否则主程序直接宕掉,这是我们不希望看到的。 或者全程检查error,不主动抛出异常。即便这样,可能异常依然不能避免。 既然要recover(),但又不想在每个handle里面都去recover()一遍,如果你也有这样的需求,下面讲到的可能对你有用。 func RegRouters(r *httprouter.Router) { r.GET("/", Home) r.GET("/contact", Contact) } func Hom...阅读全文

博文 2017-09-21 22:30:00 ronli

双向链表的GO语言实现

一、什么是双向链表 和单链表比较,双向链表的元素不但知道自己的下线,还知道自己的上线(越来越像传销组织了)。小煤车开起来,图里面可以看出,每个车厢除了一个指向后面车厢的箭头外,还有一个指向前面车厢的箭头(车头、车尾除外)。车头只有指向后面车厢的箭头,车尾只有指向前面车厢的箭头。 二、双向链表与Go的对应结构 1、节点 我们先把车厢分解开来。每节车厢都由煤炭、车体、拉前车厢绳索、拉后车厢绳索这4部分组成。车体是我们的运输工具,在Go语言里我们用结构提DNode表示;煤炭代表运的货物,用data变量表示;拉前车厢绳索和拉后车厢绳索我们分别用指针prev和next表示。这样一节车厢,用Go语言描述如下: type DNode struct { data Object prev *DNode nex...阅读全文

博文 2017-11-09 08:04:40 懒人记

Golang 内存管理源码剖析

Golang 的内存管理基于 tcmalloc,可以说起点挺高的。但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现。下面的源码分析基于 go1.8rc3。 1.tcmalloc 介绍关于 tcmalloc 可以参考这篇文章 tcmalloc 介绍,原始论文可以参考 TCMalloc : Thread-Caching Malloc。 2. Golang 内存管理0. 准备知识这里先简单介绍一下 Golang 运行调度。在 Golang 里面有三个基本的概念:G, M, P。 G: Goroutine 执行的上下文环境。 M: 操作系统线程。 P: Processer。进程调度的关键,调度器,也可以认为约等于 CPU。 一个 Goroutin...阅读全文

博文 2017-07-02 19:25:43 Tao Kelu

Hdu 5193 Go to movies Ⅱ(带删除数插入数的逆序数对,块状链表)

传送门:Hdu 5193 Go to movies Ⅱ 题意: 有n个人站成一排,每个人的身高为Hi。每次有人加入或者有人离开,就要判断有多少人站反了(i < j&&Hi>Hj) 第一行n,m,接下来n个整数(n,m<=2e4) 接下来m行, 0 x y 表示有一个身高为y的人插在x后面,x=0表示插在最前面。(1≤y≤n) 1 x 表示第x个人(从左到右)离开。 思路:摘自题解http://bestcoder.hdu.edu.cn/solutions.php?page=12 添加或者删除一个元素时,维护逆序对时,需要知道在它之前有多少个数比它大,在它之后有多少个数比他小。有下标和权值两个维度,可以使用两个数据结构嵌套。题目中n=20000,范围不大,外层可以使用分块维护下标,这样添加和删除...阅读全文

博文 2016-09-14 15:00:00 acm_fighting

golang 实现斐波那契堆

二叉堆提供了o(lgn) 时间的插入, 删除最小,降级等操作,o(n) 时间的合并操作; 斐波那契堆提供了更优操作时间界限:o(1) 插入, o(lgn) 删除最小, o(lgn) 删除, o(1)合并。 根据算法导论上说,斐波那契堆在删除最小或删除操作被执行次数相比其他操作少得多时,尤为适用。一些图的算法中(计算最小生成树,单源最短路径)作为基本构建块(作为优先队用)。 考虑到斐波那契堆实现的复杂,可能二叉堆在实践上更具可用性。就像rob pike 在 里说: 3. 花哨的算法在 n 很小时通常很慢,而 n 通常很小。花哨算法的常数复杂度很大。除非你确定 n 总是很大,否则不要用花哨算法。 4. 花哨的算法比简单算法更容易出bug,更难...阅读全文

博文 2015-03-18 17:00:01 yujian0231

go结构体的用法总结

1,struct加上指向本类型的指针,可以实现链表等复杂数据结构,,然后实现队列和堆栈等常用数据类型。 2,struct和interface实现了go的继承,通过组合,或者说是嵌套完成继承。 3,一些特殊用法。 首先,空的interface重要用途是可以解析未知json!因为interface能继承任意类型,所以,web的接口中用json,可以直接用map[string] interface{}多重嵌套的方式实现解析未知json。 空的struct,可以用来做method reciver,只有属性,没有方法。比如: type classA struct { } func (s * classA) method1 ()(){ } func (s * classA) method2 ()(){ ...阅读全文

博文 2017-07-06 03:03:31 dmwan

Redis的数据类型及具体应用

Redis是一个key-value存储系统,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)等等。下面小编就和大家详细聊聊Redis的数据类型及其操作。 String 这是最简单的数据类型,一个Key对应一个Value,string类型是二进制安全的。Redis的string可以包含任何数据,如图片或序列化的对象。 String的操作: Set:设置key对应的值为string类型的value,如 set name Fahy Setnx:设置key对应的值为string类型的value,如果key已经存在,返...阅读全文

Go语言内存分配器-FixAlloc

Go语言内存分配器-FixAlloc 09 October 2013 skoo 阅读 918 次 1 人喜欢 0 条评论 收藏 昨天写了一篇Go语言内存分配器设计,记录了一下内存分配器的大体结构。在介绍内存分配器的核心实现前,本文先介绍一下内存分配器中一个工具组件——FixAlloc。FixAlloc称不上是核心组件,只是辅助实现整个内存分配器核心的一个基础工具罢了,由此可以看出FixAlloc还是一个比较重要的组件。引入FixAlloc的目的只是用来分配MCache和MSpan两个特定的对象,所以内存分配器中有spanalloc和cachealloc两个组件(见《Go语言内存分配器设计》的图)。MCache和MSpan两个结构在malloc.h中有定义。 定义在malloc.h文件中的Fi...阅读全文

博文 2016-04-11 08:00:04 caoshulin1989

肖威洞察 | 如何完成人才的培养工作

肖威先生 SuperX CEO 前一段时间我已经说过,我们的孩子的想要在真实的互联网环境下完成自己的立足的关键,在于完成三个知识体系的获取,从而帮助自己快速的厚的立足当下真实环境的能力,其中包括: 1、公司运作的管理能力 2、产品运营的销售能力 3、产品打造的技能能力 在以上的能力体系当中,最关键的部分在于如何完成产品的技能体系的打造,在这个过程中,我们需要完成的知识体系的提升的关键在于: 1、前端的代码的全栈设计能力 2、后端的功能的全栈代码能力 3、云端的系统的维护代码能力 我们现在在完成知识体系的过程中,我们多大多数人都在完成前端的查看,而不具备后端代码和云端代码的运维能力,所以在这个时候才不可以获得在互联网空间立足的能力,在超级课程表的介绍的过程中,其实对于互联网的产品的架构已经完成...阅读全文

博文 2018-07-21 17:34:44 肖威洞察

HTTP/2服务端推送

翻译:shihuaping0918@163.com 【译者注:本文需要有一定的HTTP协议知识和浏览器解析页面过程知识】 原文 :https://blog.golang.org/h2push 前言 HTTP/2被设计为解决HTTP/1.x的许多缺陷。当代网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP/1.x中这些资源每一个都必须明确地请求。这可能是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。因为服务器必须等待浏览器做每一个请求,网络经常是空闲的和未充分使用的。 为了改善延迟,HTTP/2引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前。一个服务器经常知道一个页面需要很多附加资源,在它响应浏览...阅读全文

博文 2017-09-30 03:34:56 天一阁图书管理员

golang爬虫小案例

### 爬虫步骤 + 想要学习更多的小项目欢迎访问我的博客www.5lmh.com + 明确目标(确定在哪个网站搜索) + 爬(爬下内容) + 取(筛选想要的) + 处理数据(按照你的想法去处理) ```go package main import ( "fmt" "io/ioutil" "net/http" "regexp" ) //这个只是一个简单的版本只是获取QQ邮箱并且没有进行封装操作,另外爬出来的数据也没有进行去重操作 var ( // \d是数字 reQQEmail = `(\d+)@qq.com` ) // 爬邮箱 func GetEmail(...阅读全文

ldd、objdump、nm、strings、strip等工具

最近在做Docker镜像的时候发现镜像文件非常大,需要找出程序的依赖库,减少程序的大小,所以整理了一下相关的工具。基本上这些工具都在GNU Binutils中。 GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。当前的版本原本由在Cygnus Solutions的程序员以Binary File Descriptor library(libbfd)所撰写。这个工具程序通常搭配GCC、make、和GDB这些程序来使用。 它包含20个左右的工具,本文介绍了我在创建Docker镜像的时候的使用的几种工具。 ldd ldd不是GNU Binutils工具集中的一个工具,但是却是一个非常有用的工具, 它可以显示程序或者共享库所需的共享库。 ...阅读全文

博文 2018-09-01 17:08:44 smallnest

golang开发的ID生成器 go-id-builder

这是一个使用golang开发的ID生成器,它可以提供通过高效的方式产生连续唯一的ID值。在分库分表时可以提供非常有用的帮助。 **为什么要做id生成器** ** ** **如何实现的** go-id-builder使用mysql来做为最大id数的持久化存储。程序在每次启动的时候都会加载数据表中当前的所记录的id类型,将会自动申请1000个(配置文件中可修改)新的id号,加载到一个缓冲通道中,当用户向生成器的api接口发起请求时,从对应的缓冲通道中将数据取出返回给客户端...阅读全文

拜托,面试别再问我回文链表了!!!

题目描述 请判断一个链表是否为回文链表。 示例1: 输入: 1->2 输出: false 示例2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解题思路 思路1 遍历链表,用数组存下每个节点的值,然后从数组两头开始向中间遍历,是否相等 时间复杂度O(n),空间复杂度O(n) 思路2 遍历一遍链表,得到链表长度n,根据长度的奇偶,找到中间节点,将左半边的链表反转,然后从中间节点分两个方向向左右两边遍历,是否是回文;对左半部分链表进行反转,还原为最初的链表 只需要固定的若干个临时变量,不需要额外开辟空间 时间复杂度为O(n),空间复杂度为O(1) 代码实现 // ListNode Definition for sing...阅读全文

博文 2018-10-23 20:34:58 TomorrowWu

Golang——append的可变参数

合并slice,跟合并数组一样,是比较常见的操作。映像中C++运算符重载以后,直接用加号就可以了。Golang果断不行。先开始用copy解决。 func copy(dst, src []Type) int 从来没用过这个函数,返回值和append还不一样,返回的是复制的数目。而且只能针对slice操作,不支持其他类型。能参数表也能看出,两个参数必须是同一种类型,不可以是[]Type和[]interface{}这种形式。此函数也不是追加到dst后面,而是从头开始复制。如果要追加到后面,还需要指出位置信息。copy实现的合并数组完整代码: a := []int{1, 2, 3, 4} b := []int{5, 6, 7} c := make([]int, len(a)+len(b)) copy...阅读全文

博文 2017-02-09 12:25:08 Bryce

golng 使用postgres数据库

```go package main import ( "fmt" "log" "time" "github.com/go-xorm/xorm" _ "github.com/lib/pq" ) var engine *xorm.Engine func main() { } func init() { psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", "127.0.0.1", 5432, "postgres", "12345678", "postgres") var err error engine, err = xorm.NewEngine("postgres", ...阅读全文

博文 2018-01-19 13:27:18 hfyarvin

Go读取大量数据,开启多协程,将读取的文件内容导入数据库,出现丢失数据现象

各位大佬,Go新人,昨天写了一个数据库导入工具,从本地文件并导入DbFileReadWriteChanel的数据是正确无缺少的,就在开启100协程写入数据,执行完毕后,发现导入后的数据表中缺少了100多条。
\ 清空数据表后,又运行,一次还是缺少,然后进行少量的数据测试,发现,还是丢失,但如果只是使用主线程,导入,则无问题。
初步思考,代码出现问题的范围为一下代码块,请各位大佬协助,帮忙找一下问题所在,谢谢帮助。
``` //将存入chanel中的数据导入到数据库表中 func (this *DbFileRead) ImportTable(DbFileReadWriteChanel chan DbFileRead, exitChan chan bool) error {...阅读全文

Golang Web服务器自定义路由

What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back. 你所浪费的今天是昨天死去的人奢望的明天; 你所厌恶的现在是未来的你回不去的曾经。 最近公司有一个项目不算大,但是流量预计不小,分配到我这来了,要求快速上线,由于本人研究Golang两个多月(本人愚钝),加上对GOlang的痴迷,考虑偷偷的(其实是项目总监被我说服了)使用go来写web服务。 看到这我只能说,瞎扯淡啥!! 上菜: 首先自定义路由的前提是路由对象实现ServeHTTP方法 自定义路由写法一: 1. 路由结构体对象定义 type Router...阅读全文

博文 2018-01-09 15:33:21 90design

【面试题】从链表尾部算起,删除第n个节点

给定一个链表,从链表尾部算起,删除第n个节点,并返回链表头节点。 例如: > 给定列表:1->2->3->4->5,和 n = 2。 > 从尾部算起,删除第2个节点后,链表变为:1->2->3->5。 说明: 1. 给出的 n 总是有效的,比如不会出现负数。 2. 尽可能使用 O(n) 算法实现。 Go 示例定义: ```go /** * 定义一个单链表: * type ListNode struct { * Val int * Next *ListNode * } */ func removeNthFromEnd(head *ListNode, n int) *ListNode { } ...阅读全文