golang

golang中container/ring包用法

自古美人都是妖i 提交于 2020-02-29 06:29:18
ring包实现了环形链表的操作。 type Ring //Ring类型代表环形链表的一个元素,同时也代表链表本身。环形链表没有头尾;指向环形链表任一元素的指针都可以作为整个环形链表看待。Ring零值是具有一个(Value字段为nil的)元素的链表。 type Ring struct { Value interface{} // 供调用者使用,本包不会对该值进行操作 // 包含未导出字段 } func New(n int) *Ring //创建一个长度为n的环形链表 func (r *Ring) Do(f func(interface{})) //对链表中任意元素执行f操作,如果f改变了r,则该操作造成的后果是不可预期的。 func (r *Ring) Len() int //求环长度,返回环中元素数量 func (r *Ring) Link(s *Ring) *Ring //Link连接r和s,并返回r原本的后继元素r.Next()。r不能为空。 如果r和s指向同一个环形链表,则会删除掉r和s之间的元素,删掉的元素构成一个子链表,返回指向该子链表的指针(r的原后继元素);如果没有删除元素,则仍然返回r的原后继元素,而不是nil。如果r和s指向不同的链表,将创建一个单独的链表,将s指向的链表插入r后面,返回s原最后一个元素后面的元素(即r的原后继元素)。 func (r *Ring)

Golang实现高性能凑单工具:给定<金额列表>计算<目标金额>所有组合

南笙酒味 提交于 2020-02-29 01:01:55
目录 一、需求 二、实现思路 三、最终方案:动态规划 四、使用方式 1.直接调用代码(适合用来开发自己的软件) 2.命令行模式(适合不会编程的人使用) 五、总结 一、需求 公司有一个比较坑爹的报销方案,需要根据一堆碎的发票中,凑出一个目标金额,要求误差在1块钱以内 缺点:每次人肉去对比,浪费大量的时间。 大概是这样的,新建一个excel表格,将所有的金额录入,然后自己勾选发票,直到目标金额出现,如下图 二、实现思路 最差方案:全组和 使用全组合,搜索所有组合方案,遍历满足的结果输出,时间复杂度为O(n!),原先调用了python的排列组合函数实现,结果卡得不行,有时候能把程序跑挂了 中等方案:回溯暴力破解 利用回溯输出,存在重复递归,时间复杂度为O(2^n),一般来说已经满足正常需求,但是如果n很大,还是影响性能 最优方案:动态规划 时间复杂度为O(n*w),为最快方案,提升气质指数,5颗星! 三、最终方案:动态规划 最终用动态规划思想实现,空间换时间,200个碎票匹配1万的金额秒出结果,大概使用800M内存, 代码已经贴到github: chenqionghe/amount-calculator 核心代码如下 package main import ( "fmt" "github.com/shopspring/decimal" "strconv" "time" ) type

03. Golang 特性

匆匆过客 提交于 2020-02-28 20:02:06
多返回值 package main import "fmt" func add(a int, b int) (int, int) { return a + b, a - b } func main() { sum, sub := add(1, 2) fmt.Println(sum, sub) } 来源: https://www.cnblogs.com/liudianer/p/12378649.html

Golang 1.14 发布 | 云原生生态周报 Vol. 39

╄→гoц情女王★ 提交于 2020-02-28 19:33:44
作者 | 陈俊、何淋波、李鹏、宋净超 业界要闻 Golang 1.14 发布 Golang Release 了 1.14 版本。该版本包含生产级别 go module,改进 defer 性能,以及 Goroutine 抢占等功能。 Cilium 1.7 版本发布 Cilium 是一款开源软件,负责以透明方式提供并保护由 Linux 容器管理平台(例如 Kubernetes)部署完成的各应用程序服务间的网络与 API 连接。 Contributor Summit Amsterdam Schedule Announced 去阿姆斯特丹 KubeCon 的同学,不要忘记注册这个难得的开发者聚会。 KubeCon + CloudNativeCon China 2020 议题提交即将结束 将于中国时间 2 月 28 日结束,请大家不要忘记时间点。 上游重要进展 Kubernetes Honor status.podIP over status.podIPs when mismatched 修复老版本 Pod API 里 Pod.Status.PodIP 兼容 Pod.Status.PodIPs。建议大家紧急 Port 这个 PR,否则 1.15 版本以下的 kubelet 向 1.16 或者以上的 API Server 更新 Pod Status。 Adding AppProtocol to

golang-闭包实例详解--未完

孤人 提交于 2020-02-28 17:54:38
闭包 概念 闭包函数 :声明在一个函数中的函数,叫做闭包函数。 闭包 :内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。 特点 让外部访问函数内部变量成为可能; 局部变量会常驻在内存中; 可以避免使用全局变量,防止全局变量污染; 会造成内存泄漏(有一块内存空间被长期占用,而不被释放) 闭包的创建 闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,互不干扰。闭包会发生内存泄漏,**每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址。**但凡是当前活动对象中又被内部子集引用的数据,那么这个时候,这个数据不删除,保留一根 闭包实例 示例一 返回一个内部函数 package main import "fmt" //函数片段 func add ( base int ) func ( int ) int { // 1:创建一个新内存, 其地址并命名为base用来存储int变量, 然后取出a内存处存放的值,复制一份,放入base内存 fmt . Printf ( "%p\n" , & base ) //2:打印变量地址0xc0420080e0, 里面存储着10【它是函数拷贝传值】 f := func ( i int ) int { //3:定义一个函数,并且用f指向它[f里面存储着这个函数的地址] //7

Golang中new和make的区别

醉酒当歌 提交于 2020-02-28 12:03:50
总结几点: new会分配结构空间,并初始化为清空为零,不进一步初始化 new之后需要一个指针来指向这个结构 make会分配结构空间及其附属空间,并完成其间的指针初始化 make返回这个结构空间,不另外分配一个指针 例子new: var p *[]int = new([]int) 或 p := new([]int) 以上分配了一个slice结构,但是结构中的应该指向底层数组的ptr指针为空,故实际不能往这个slice里面存取数据 同时分配了一个指针p,也即(在32位系统中)占4个字节并存放slice结构的地址 例子make: var v []int = make([]int, 0) v := make([]int, 0) 以上分配了一个slice结构,且结构中的应该指向底层数组的ptr指针已经指向了某个底层数组,这个底层数组应该已经分配了,故这个slice已经可以使用了 注意v就是这个slice结构,而不是一个指向slice的指针 上述仅是示例,一般使用时都会明确长度和容量:v := make([]int, 10, 50) 结论: 由上可见,用new来分配slice的意义不大,因为没有恰当的初始化,无法直接使用 有附带空间的结构,使用make来初始化,可以完成内部指针初始化,其后可以立即使用 来源: oschina 链接: https://my.oschina.net/u

golang中map的声明与初始化

心不动则不痛 提交于 2020-02-28 09:52:46
第一种: 声明一个key是字符串,值为int的字典,这种方式的声明需要在使用之前使用make初始化 var numbers map[string]int 初始化 numbers = make(map[string]int) var numbers map[string]int numbers = make(map[string]int) numbers["one"] = 1 //赋值 numbers["ten"] = 10 //赋值 fmt.Println(numbers) 另一种: 声明并初始化 number := make(map[string]int) number := make(map[string]int) number["two"] = 2 //赋值 number["five"] = 5 //赋值 fmt.Println(number) 来源: CSDN 作者: 天马行空波 链接: https://blog.csdn.net/jiangbo721/article/details/104533693

Golang 设计模式

心已入冬 提交于 2020-02-28 07:35:17
单例模式 package main import "sync" var instance *Single var once sync.Once type Single struct {} func NewSingle() *Single { once.Do(func() { instance = new(Single) }) return instance } 工厂模式 package main import ( "fmt" ) type Phone interface { Call() } type Mi struct{} type Iphone struct{} func (mi *Mi) Call() { fmt.Println("喂...(mi)") } func (i *Iphone) Call() { fmt.Println("喂...(iphone)") } type Factory struct{} func (f *Factory) Create(name string) Phone { switch name { case "mi": return new(Mi) case "iphone": return new(Iphone) default: panic("找不到这个手机:" + name) } } func main() { f := new

golang跨平台设置系统时间

微笑、不失礼 提交于 2020-02-28 06:26:50
调用阿里云很多golang接口,如果本地时间不对,就会导致接口调度异常。 golang版设置系统时间函数: ```golang //2020-1-1 16:55:51 格式 func UpdateSystemDate ( dateTime string ) bool { system := runtime . GOOS switch system { case "windows" : { _ , err1 := gproc . ShellExec ( `date ` + gstr . Split ( dateTime , " " )[ 0 ]) _ , err2 := gproc . ShellExec ( `time ` + gstr . Split ( dateTime , " " )[ 1 ]) if err1 != nil && err2 != nil { glog . Info ( " 更新系统时间错误 : 请用管理员身份启动程序 !" ) return false } return true break } case "linux" : { _ , err1 := gproc . ShellExec ( `date -s "` + dateTime + `"` ) if err1 != nil { glog . Info ( " 更新系统时间错误 :" , err1 .

golang实现插入排序算法

北慕城南 提交于 2020-02-28 05:50:02
//插入排序 package alg func Insertion(arr []int) []int { len := len(arr) if len <= 1 { return arr; } for i := 1; i < len; i++ { //获取当前需要插入已排序区域的元素值 val := arr[i] j := i - 1 for ; j >= 0; j-- { if arr[j] > val { //移动数据 arr[j+1] = arr[j] } else { //如果arr[j]小于arr[i],则对已排序区无需再排序 break; } } //插入排序 第一位 arr[j+1] = val } return arr } 来源: oschina 链接: https://my.oschina.net/hackdebug/blog/3158511