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

Go 记录日志——log包

Golang's log模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”,对每一类接口其提供了3中调用方式,分别是 "Xxxx 、 Xxxxln 、Xxxxf",基本和fmt中的相关函数类似,下面是一个Print的示例: package main import ( "log" ) func main(){ arr := []int {2,3} log.Print("Print array ",arr,"\n") log.Println("Println array",arr) log.Printf("Printf array with item [%d,%d]\n",arr[0],arr[1]) } 会得到如下结果: 2016/12/15 19:46:19 Pri...阅读全文

博文 2016-12-15 13:00:03 吃一堑消化不良

golang语言构造函数

1、构造函数定义 构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。 而golang没有相关的构造函数定义,只能通过new来创建构造函数。 2、构造函数声明 声明一个struct结构: 声明一个全局函数,返回*struct ok,到此已经构造函数定义完...阅读全文

GO语言:优雅地实现多重继承

有些语言支持多重继承,但是如果多个父类存在相同的属性或方法,就会发生冲突,有些语言为了防止这种情况而只支持单继承,很明显就没有了复用多个父类的属性和方法的优势。go语言其实没有对象的概念,只有结构体。比如有一个父亲,是中国人:type Father struct { MingZi string } func (this *Father) Say() string { return "大家好,我叫 " + this.MingZi }可以理解为父亲类有一个属性,有一个Say方法有父亲当然有母亲,母亲是个外国人:type Mother struct { Name string } func (this *Mother) Say() string { return "Hello, my name i...阅读全文

golang内存释放

一、前言 一般在golang运行完成初始化时,会创建专门的goroutine用于后台监控、定期任务,这其中也涉及到了强制垃圾回收、内存释放等任务。 // 主goroutine. func main() { // ... // m0: 系统主线程 // g0:主goroutine // m0、g0是比较特殊的 仅用于main goroutine的父goroutine g.m.g0.racectx = 0 if sys.PtrSize == 8 { // 64bits 系统 maxstacksize = 1000000000 } else { // 32bits系统 maxstacksize = 250000000 } // 新建M(物理线程) mainStarted = true if GOA...阅读全文

博文 2019-01-09 22:34:43 神奇的考拉

图解Golang的GC算法

虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。以下是Golang GC算法的里程碑:v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write barrier经典的GC算法有三种: 引用计数(reference counting)、 标记-清扫(mark&sweep)、 复制收集(CopyandCollection)。Golang的GC算法主要是基于 标记-清扫(markandsweep)算法,并在此基础上做了改进。因此,在此主要介绍一下标记-清扫(mark and sweep)算法,关于引用计数(reference counting)和复制收集(copy ...阅读全文

博文 2019-03-12 13:13:13 互联网技术窝

Go语言 传值和传指针性能对比

载自达达的博客 以往的C编程经验告诉我们,指针传参会有更好的性能,在Go语言中,这条经验也是通用的。但是需要留意两个问题: 指针传参会导致参数的操作领域不确定,到底函数内部会不会改变传入的对象呢?Go语言中没有类型C那样的const关键字,所以无法控制。Go语言是有GC的,并且这个GC还不是很完善,受对象数量影响较大,传递指针意味着可能多创建不必要的对象,到底指针传参带来的性能提升能不能抵消创建对象产生的GC压力呢?这是一个不好观察到的数据。(原作者达达这里应该是有错误的,首先传值也是复制,要产生一个新对象,分配内存地址传到新的函数中,其次指针一般来说64个字节,复制的代价远小大中型数据传值,因此在都产生一个新对象的情况下,指针还是远优先于传大中型的值结构) 下面是性能消耗的测试代码: pa...阅读全文

博文 2014-10-09 18:00:00 abv123456789

goquery的使用

title: goquery的使用 tags: go,goquery,爬虫 author: Clown95 本文参考 飞雪无痕 的 《golang goquery selector(选择器) 示例大全》 概述 相信很多小伙伴对爬虫有着很大的兴趣,今天我们就来说下go语言的爬虫利器goquery,有使用过jquery的小伙伴是不是看着这个很眼熟?goquery类似jquery,它是jquery的go版本实现,使用它,可以很方便的对HTML进行处理。 goquery是基于 Go net/htm包和css选择器库 cascadia。由于net/htm解析器返回的是DOM节点,而不是完整的DOM树,因此, jQuery的状态操作函数没有实现(像height(), css(), detach) 注意:...阅读全文

博文 2019-04-16 20:34:45 clown1995

golang snmp开发学习笔记(二)

soniah/gosnmp是一个纯go语言编写的SNMP包,基于alouca/gosnmp开发。目前提供GetRequest、GetNext、GetBulk、Walk和SetRequest功能,支持IPv4和IPv6, 支持SNMPv2c和SNMPv3。 本文介绍soniah/gosnmp的SetRequest和Walk操作。 SetRequest snoiah/gosnmp的GoSNMP.Set()方法有一个明显的错误: func (x *GoSNMP) Set(pdus []SnmpPDU) (result *SnmpPacket, err error) { if pdus[0].Type != Integer || pdus[0].Type != OctetString { retur...阅读全文

博文 2015-10-27 08:00:01 wbchen2330

Go 应该成为开发 android 的主要语言

前几天刚看到的新闻时,我就在猜想:如果 google 要摆脱 Oracle 的诉讼纠缠,那么只有一条路:就是用 go 取代 java 成为 android 的主要开发语言。这步迟早是要走的,也许谷歌已经在暗自部署了。我一直觉得手机应用开发采用VM语言或者JS是一种短视的行为,在前期也许会因为门槛低而吸引大量程序员涌入这个市场,但是很多高级应用(对速度响应要求很高)最终都难免要回到C/C++原生函数调用上来。别对我说什么C/C++门槛太高,两年前谁知道ObjectiveC,现在排行榜都到第九位了。苹果的ObjectiveC,诺基亚的C++/QT都选对了开发语言,相信Google很快会采用Go回到正轨,手机...阅读全文

Go 反射:根据类型创建对象-第二部分(复合类型)

> 这是关于 Golang 中根据类型创建对象系列博客的第二篇,讨论的是创建复合对象。第一篇在[这里](https://studygolang.com/articles/12434) ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-reflect/cover1.png) 在前一篇博客中,我解释了 go reflect 包 `type` 和 `kind` 的概念。这篇博客,我将深入探讨这些术语。因为相比原始类型,`type` 和 `kind` 对于复合类型来说含义更多。 ## 类型和种类 “类型” 是程序员用来描述程序中数据和函数的元数据。`type` 在 Go 的运行时和编译器中有不同的含义。 可...阅读全文

博文 2018-03-09 09:18:56 polaris

Go中实现手动内存分配的坑

Go中实现手动内存分配的坑 2016-07-10 你一定想到过,分配一块大的内存,然后从里面切小的对象出来,手动管理对象分配。分配的开销非常小,就是offset加一下。尤其是有些场景,释放时直接把offset重置,就可以重用这块空间了。实现手动内存分配的好处是,减少小对象数目,从而减少垃圾回收时的扫描开销,降低延迟和提升整个性能。 想到不代表做过,做过会踩坑,这篇文章会把你可能要踩的坑都说一遍。不过先说结论:别这么干,不作死就不会死! TL;DR 扩容 开始很容易想用make([]byte)分配空间,如果大小不够时,还可以进行扩容。这是第一个陷阱。 不要append,别让它扩容。一旦发生扩容,会分配一块新的空间,而旧的slice将不再有任何变量引用它,于是会被垃圾回收掉。等等!之前分配的对象...阅读全文

golang中的type转换

大家都知道,golang中可以这样定义一个类型: type PowerString string 这种不是面向对象中的继承,但有点像,因为PowerString能得到string的属性方法等。 我们给PowerString写个方法: func (ps PowerString) Print() { fmt.Println(ps) } 那怎么新建一个PowerString呢? 不需要特意写一个new方法,直接把一个string转换成PowerString就可以了: ps := PowerString(“Hi, you!”) ps.Print() 当然你也能新建一个PowerString转换过来的string: str := string(ps...阅读全文

博文 2015-06-17 20:03:54 u011649436

七牛---关于GO SDK的各种Demo

具体可以参考七牛GO SDK的源码以及官网使用文档,以下Demo针对V7版本的SDK: https://github.com/qiniu/go http://developer.qiniu.com/code/v7/sdk/go.html 文件上传 简单上传 package main import ( "github.com/qiniu/api.v7/kodo" "qiniupkg.com/api.v7/conf" "qiniupkg.com/api.v7/kodocli" "fmt" ) var ( //设置上传到的空间 bucket = "yourbucket" ) //构造返回值字段 type PutRet struct { Hash string `json:"hash"` Key s...阅读全文

博文 2016-03-24 14:00:01 netdxy

Go 反射:根据类型创建对象-第一部分(原始类型)

> 这是关于在 Go 中根据类型创建对象的博客系列两部分的第一部分。这部分讨论原始类型的对象创建 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-reflect/cover1.png) Go 中的 reflect 包提供了根据执行过程中对象的类型来改变程序控制流的 API。 reflect 包提供了两个重要的结构 - Type 和 Value。 Type 是一个 Go 中任何类型的代表。换句话说,它可以被用于编码任何 Go 类型(例如:int , string , bool , myCustomType 等等)。Value 是一个 Go 中任何值的代表。换句话说,它可以被用于编码、操作任何...阅读全文

博文 2018-02-23 17:51:11 polaris

golang面向对象

golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。 类的声明: //声明一个类 type People struct { Name string Sex int32 Address string } 这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。 类方法声明: //声明一个类的方法 func (people People) Publish() { fmt.Println("method :Publish") } func (people *People) Sho...阅读全文

博文 2015-07-29 03:00:00 wangjunqiao

C++中的友元函数和友元类的使用方法

在c++编程中,我们常常接触到类的概念,众所周知,一般类中有公用的(public)成员和私有的(private)成员,公用成员可以通过外部访问,私有成员只有奔雷中的函数才可以访问。今天小编将给大家介绍一个不遵循此规则的类,那就是友元(friend)。 C++中的友元是好友的意思,可以访问与其有好友关系的类中的私有成员,友元包括友元函数和友元类,下面我们就一起来看看他们的用法吧。 友元函数 在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。友元函数可以访问当前类中的所有成员,包括 private 属性的。 1、 将普通函...阅读全文

go web 权限管理 解决方案 (面向对象权限 ABAC / Casbin)

go web 权限管理 解决方案 (面向对象权限 ABAC / Casbin) 说明 ABAC调用 github.com/casbin/casbin abac_model.conf [request_definition] r = sub, obj, act [policy_definition] p = sub, obj,act [policy_effect] e = some(where (p.eft == allow)) [matchers] m = r.sub.App == r.obj.App && r.sub.Type == r.obj.Type && r.sub.Method == r.obj.Method main.go package main import ( "fmt" ...阅读全文

博文 2019-05-15 18:35:26 295631788

开发者必须知道的五款工具

任何高明的程序员都不可能一次性写出完美的代码,因此APP测试以及调试就成了开发者们必修的一项技能。一些工具可以让开发者们事半功倍,所以本文介绍了五款诊断调试工具,可以帮助我们对代码、UI界面等进行调试。 TestBird 这是国内大名鼎鼎的手游和APP云测平台,能提供APP和游戏的自动化测试、真人体验测试、服务器压力测试。TestBird目前已经拥有超过2000款手机,能够让这些手机自动运行各类APP,并生成测试结果。测试报告中丰富的截图和日志,可以帮助开发者们快速定位BUG,提高工作效率。 Cocoa LumberJack Cocoa LumberJack是一个功能强大的NSlog,是通用的Cocoa日志框架之一。它可以提供更高级的log功能,比如记录log至文件或网络...阅读全文

golang不到30行代码实现依赖注入

项目地址 go-di-demo 本项目依赖 使用标准库实现,无额外依赖 依赖注入的优势 用java的人对于spring框架一定不会陌生,spring核心就是一个IoC(控制反转/依赖注入)容器,带来一个很大的优势是解耦。一般只依赖容器,而不依赖具体的类,当你的类有修改时,最多需要改动一下容器相关代码,业务代码并不受影响。 golang的依赖注入原理 总的来说和java的差不多,步骤如下:(golang不支持动态创建对象,所以需要先手动创建对象然后注入,java可以直接动态创建对象) 通过反射读取对象的依赖(golang是通过tag实现) 在容器中查找有无该对象实例 如果有该对象实例或者创建对象的工厂方法,则注入对象或使用工厂创建对象并注入 如果无该对象实例,则报错 代码实现 一个典型的容器实...阅读全文

博文 2018-07-24 19:34:52 xialeistudio

Go ADM,Go语言轻量ORM

厚颜无耻的推荐一下,go-adm,Go语言轻量ORM。0.1.0分支已经实现类面向对象的操作方式,说明请戳这里。 目前的总体特性已经完成,暂时不会增加其他的特性,待0.1.0的面向对象化的特性测试完善,会合并到主分支中。 艾玛,不要打我,就是推荐一下,不要打脸…… 咳,Go的确吊炸天,我计划将agimvc也搬到Golang上,不过mvc这个词可以丢掉了...阅读全文

博文 2015-05-07 08:00:00 曾建凯

go 类型方法 receiver的理解

package main import "fmt" type Person struct{ name string age int } func (this *Person) Growth(){ this.age ++ } func (this *Person) ChangeName(newname string){ this.name = newname } func main(){ p := Person{"wangzy", 30} p.Growth() fmt.Printf("%d", p.age) } 因为go不是面向对象的,struct也不是类,没有类方法,但是通过类型方法,提供该struct 的方法,类似类方法了。 可以通过类实例去调用。 感觉完全可以替换的 可以通过该结构体的引...阅读全文

博文 2016-04-02 23:00:01 frankwangzy1103

Golang设计模式实现1-工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决:主要解决接口选择的问题。 何时使用:我们明确地计划不同条件下创建不同实例时。 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。 关键代码:创建过程在其子类执行。 应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate ...阅读全文

Go语言使用组合的方式实现多继承

在大多数面向对象的编程语言中多继承都是不支持的。因为在基于class的体系中,多继承极大地增加了编译器的复杂性。 Go语言使用组合的方式实现继承,因此也可以很简单的实现多继承。 //使用组合的方式实现多继承 type Phone struct{} func (p *Phone) Call() string { return "Ring Ring" } type Camera struct{} func (c *Camera) TakeAPicture() string { return "Click" } //多继承 type CameraPhone struct { Camera Phone } func structTest0803() { cp := new(CameraPhone) ...阅读全文

大话设计模式(golang) 六、原型模式

模式特点:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 程序实例:从简历原型,生成新的简历,简历类Resume提供Clone()方法。 package main import ( "fmt" ) type PersonalInfo struct { name string sex string age string } type WorkExperience struct { timeArea string company string } type Resume struct { PersonalInfo WorkExperience } func (this *Resume) SetPersonalInfo(name string, sex string, age s...阅读全文

博文 2016-08-04 20:00:14 平凡之路

大话设计模式(golang) 五、工厂方法模式

模式特点:定义一个用于创建对象的接口,让子类决定实例化哪一个类。这使得一个类的实例化延迟到其子类。 程序实例:计算器。 package main import ( "fmt" ) type Operation struct { a float64 b float64 } type OperationI interface { GetResult() float64 SetA(float64) SetB(float64) } func (op *Operation) SetA(a float64) { op.a = a } func (op *Operation) SetB(b float64) { op.b = b } type AddOperation struct { Operation...阅读全文

博文 2016-08-04 20:00:15 平凡之路

golang学习的点点滴滴:读写文件(面向对象版)

package main import ( "fmt" "bufio" "io" "os" "flag" "strconv" ) // 定义一个结构体 type ReadWrite struct { In *string Out *string } // 定义初始化方法 func (rw *ReadWrite) Init() { rw.In = flag.String("in", "in", "in") rw.Out = flag.String("out", "out", "out") flag.Parse() } // 定义读文件的方法 func (rw *ReadWrite) Read() (result []int, err error) { file, err1 := os.Open...阅读全文

博文 2014-10-04 19:27:44 亓斌哥哥

[golang note] 类型系统

值和引用 • 值语义和引用语义 值语义和引用语义的差别在于赋值: b = a b.Modify() 如果b的修改不会影响a的值,那么属于值类型,否则属于引用类型。 • 值类型和引用类型 √ 引用类型一个特点:引用不绑定特定对象(c++中引用是要绑定特定对象),例如有两个同类型引用a和b,它们可以引用各自的对象A和B;但如果a和b的引用都指向A,那么通过b修改对象内容可以反应到a引用之中。 √ golang从本质上说,一切皆是值类型,并没有内建一个类似java或c#等语言中的reference类型。 √ golang可以使用指针,可以在行为上达到类似java或c#等语言中reference的效果。 √ golang中从行为表现上看,数组属于值类型,数组切片、字典、通道和接口属于引用类型。 ▶ ...阅读全文

博文 2016-03-08 09:00:01 heartchord

浅尝Go语言GC

大家好,我是小栈君,因为个人和工作的缘故,所以拖更了一点时间,但是关于拖更的内容小栈君会在后续的时间中补回来,还希望大家继续支持和关注小栈君。当然,在国内疫情稍微减缓的情况下,小栈君在这里也多说两句,在非常时刻,我们应当保持警惕,清洗手,多通风,避免人群聚集,希望大家平安健康, 闲话不多说,我们直接进入正题,今天给大家分享的事关于Go语言中的GC,本期的分享并没有多少代码可言,都是一些理论知识,希望大家耐心且看完,因为能力有限,所以这边小栈君会尽量用大白话来进行叙述,如有错误之处,还请多多谅解。 GC含义: 对于编程有经验的同学应该都知道GC,他的英文全称是garbage collector ,也就是我们通常所说的垃圾收集器。其实Go语言的垃圾收集器是相对于C++语言有十分重要的改进,针对于...阅读全文

博文 2020-04-02 02:32:44 IT干货栈

Golang 工厂模式

1_CdjOgfolLt_GNJYBzI-1QQ.jpeg 简单工厂模式 简单工厂模式(Simple Factory Pattern) :定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。 简单工厂需要: 工厂结构体 产品接口 产品结构体 示例说明 创建一个饺子店工厂结构体,和饺子类的接口。该工厂的其中一个方法用来生产不同口味的饺子,如韭菜的猪肉馅的。 type DumplingsShop struct{ Generate(t string) *Dumplings } type Du...阅读全文

博文 2020-04-13 11:32:46 frederick_hou

Golang 面向对象

继承 package main import ( "fmt" ) type People struct { name string age int weight int } type Student struct { People specialty string } // define sayHi method on People struct func (p People) sayHi() { fmt.Println(1) } func main() { p := People{"syy", 1, 2} s := Student{People{"syy", 1, 2}, "Seecialty"} p.sayHi() s.sayHi() } 下面的方法,主要作用是在People结构体上定义...阅读全文

博文 2015-01-31 23:00:11 未来还没来

go programming language(2)

http://tour.golang.org/#1一个很方便学习go的网站 今天看了一下go的流程和面向对象,印象比较深的有 1 go的var的定义格式和c相反 2 go可以多个参数一起赋值 3 go的函数可以有多个返回数值 4 go的语法糖,给任意类型添加函数 5 大小写来区别package函数的private和public 大体感觉go就是一个比较时髦的C, 下一步的学习并行和网络编程,还有一本effective Go的书。 http://go.tuna.tsinghua.edu.cn/doc/effective_go.htm...阅读全文

博文 2014-10-24 22:00:21 wangeen

go reflect 3 rules

1. Reflection goes from interface value to reflection Object. 反射可以从接口值得到反射对象 使用到reflect methods: reflect.ValueOf(i interface{}) Value reflect.TypeOf(i interface{}) Type 2. Reflection goes from refelction object to interface value. 反射可以从反射对象获得接口值 使用到reflect methods: reflect.New(typ Type) Value reflect.Zero(typ Type) Value func (v Value) Type() Type ...阅读全文

博文 2015-11-10 22:00:00 hittata

GO面向对象

GO面向对象 GO中没有隐藏的this指针 类型系统 类型系统是一个语言的类型体系,GO的类型系统包含以下基本内容: - 基础类型,如byte、int、bool、float等 - 复合类型,如数组、结构体、指针等 - 可以指向任意对象的类型 - 值语义和引用语义 - 面向对象,即所有具备面向对象特征的类型 - 接口 GO语言的类型系统: - 给任意类型添加响应的方法 type Integer int func (a Integer) Less(b Integer) bool { return a < b } 值语义和引用语义 GO语言中的大多数类型都基于值语义,包括: - 基本类型,如byte、int、bool、float32、float64和string等; - 复合类型,如数组、结构体和...阅读全文

博文 2016-04-18 12:00:04 u011409264

golang中的use-a和has-a

type Person struct { Name string Address Address } type Address struct { Number string Street string City string State string Zip string } func (p *Person) Talk() { fmt.Println("Hi, my name is", p.Name) } func (p *Address) Location() { //fmt.Println("I'm at", p.Address.Number, p.Address.Street, p.Address.City, p.Address.State, p.Address.Zip) fmt.Pr...阅读全文

博文 2016-02-04 11:00:02 menggucaoyuan

golang:Goquery简单爬虫实例

Selection类型提供的方法,这些方法是页面解析最重要,最核心的方法1)类似函数的位置操作-Eq(index int) *Selection //根据索引获取某个节点集 - First() *Selection //获取第一个子节点集 - Last() *Selection //获取最后一个子节点集 - Next() *Selection //获取下一个兄弟节点集 - NextAll() *Selection //获取后面所有兄弟节点集 - Prev() *Selection //前一个兄弟节点集 - Get(index int) *html.Node //根据索引获取一个节点 - Index() int //返回选择对象中第一个元素的位置- Slice(start, end int) ...阅读全文

博文 2018-06-28 14:34:48 熊猫卡洛斯

golang面向对象思想和实现

golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。 类声明 type Poem struct { Title string Author string intro string } 这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。 类方法声明 func (poem *Poem) publish() { fmt.Println("poem publish") } 或者 func (poem Poem) publish() { fmt.Println("poem pu...阅读全文

博文 2016-08-04 20:00:20 平凡之路

go的临时对象池--sync.Pool

一个sync.Pool对象就是一组临时对象的集合。Pool是协程安全的。Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力。一个比较好的例子是fmt包,fmt包总是需要使用一些[]byte之类的对象,golang建立了一个临时对象池,存放着这些对象,如果需要使用一个[]byte,就去Pool里面拿,如果拿不到就分配一份。这比起不停生成新的[]byte,用完了再等待gc回收来要高效得多。 type buffer []byte // pp是用于存储printer状态的一个结构体 type pp struct { buf buffer arg interface{} value reflect.Value fmt fmt reordered bool goodA...阅读全文

博文 2017-03-07 08:36:36 bigtom

golang中的面向对象的思想

test.go package main import ( "fmt" ) type T struct{ name string id int info map[string]string } func (r *T)GetName() string{ fmt.Println(r.name) return r.name } func (r *T)GetId() int{ fmt.Println(r.id) return r.id } func (r *T)GetInfo(){ var v map[string]string = r.info fmt.Println(v) } func main(){ m := map[string]string{"hello":"word"} r := &T{...阅读全文

博文 2016-06-30 08:00:02 innobase

用 Go 编写的类 Ruby 语言Rooby

Rooby 是一种面向对象的语言,可以看作是 Go 和 Ruby 的结合体,旨在实现高效微服务开发。 Can be compiled into bytecode (with `.robc` extension) Can evaluate bytecode directly Everything is object Support comment Object and Class Top level main object Constructor Support class method Support inheritance Support instance variable Support self Variables Constant Local vari...阅读全文

golang语言构造函数

1、构造函数定义 构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。 而golang没有相关的构造函数定义,只能通过new来创建构造函数。 2、构造函数声明 声明一个struct结构: 声明一个全局函数,返回*struct ok,到此已经构造函数定义完...阅读全文

博文 2016-09-10 13:00:08 迪克猪

11.蛤蟆笔记go语言——内存分配器

11.蛤蟆笔记go语言——内存分配器 内存分配器,又叫做MemoryAllocator. 核心:自主管理,缓存复用,无锁分配。 内存管理以页为基本单位,多个地址连续页构成内存块。 页是page, 连续页是span. 按 8 倍数,将小对象分成多种大小规格。size class. 三级管理机构 三级管理机构如下图1: 算法依赖连续地址,预留较大地址空间。如下图2: 按页保存 span指针。 反查 object 所属 span。 检查相邻 span 是否可合并。 快速分配,按需扩张。 如下图3: 垃圾回收 垃圾回收器引发回收操作。如下图4: 为管理对象分配内存,不占用预留地址 图5...阅读全文

博文 2016-06-19 23:00:01 notbaron

Golang高效编写(整理)

这是一篇如何编写高效Golang语言程序的文章。这是从一些开发者的经验总结中整理出来的。根据这篇文章,你可以编写出一篇更高效的Golang程序。 尽量使用直接的类型 interface{}提供了golang中的interface类似于java的interface、PHP的interface或C++的纯虚基类。通过这种方式可以提供更快捷的编码。但是这种方式也带来了一些问题,最大的问题还是性能问题。 // method 1 a.AA() // method 2 v.(InterfaceA).AA() // method 3 switch v.(type) { case InterfaceA: v.(InterfaceA).AA() } 这三组方法性能逐个下降,最好的方式是直接进行类型引用。 指针...阅读全文

go语言type使用小技巧

import "fmt" type Rank int const ( Rank001 Rank = iota Rank002 Rank003 Rank004 ) var rewards = [...]string{ "奖励1","奖励2","奖励3","奖励4", } func (r Rank) getReward() string { return rewards[r] } func main() { fmt.Println(Rank003.getReward()) } 通过这样的方式,灵活的将排名与奖励对应,并且“面向对象”,将排名,这个int类型声明为排名,并为其添加成员函数。常规方式在C/C++,Java中,就直接通过2个以维数组惊醒处理,但相对而言,go语言这种方式,真的很赞! g...阅读全文

博文 2015-06-17 23:00:29 eclipser1987