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

Go语言创建、初始化数组的各种方式

Go语言的语法很灵活,以下展示了创建并初始化数组的多种方式: //数组初始化的各种方式 func arraySliceTest0201() { //创建数组(声明长度) var array1 = [5]int{1, 2, 3} fmt.Printf("array1--- type:%T \n", array1) rangeIntPrint(array1[:]) //创建数组(不声明长度) var array2 = [...]int{6, 7, 8} fmt.Printf("array2--- type:%T \n", array2) rangeIntPrint(array2[:]) //创建数组切片 var array3 = []int{9, 10, 11, 12} fmt.Printf("...阅读全文

博文 2015-06-17 23:01:47 books1958

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生成csv

package main import ( "encoding/csv" "os" ) func main() { f, err := os.Create("test.csv")//创建文件 if err != nil { panic(err) } defer f.Close() f.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM w := csv.NewWriter(f)//创建一个新的写入文件流 data := [][]string{ {"1", "中国", "23"}, {"2", "美国", "23"}, {"3", "bb", "23"}, {"4", "bb", "23"}, {"5", "bb", "23"}, } w.WriteAll(d...阅读全文

博文 2014-10-04 19:26:36 别人说我名字很长

图解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 互联网技术窝

Golang号称高并发,但高并发时性能不高

1.管道chan吞吐极限10,000,000,单次Put,Get耗时大约100ns/op,无论是采用单Go程,还是多Go程并发(并发数:100, 10000, 100000),耗时均没有变化,Go内核这对chan进行优化。 解决之道:在系统设计时,避免使用管道chan传递主业务数据,避免将业务流程处理流程分割到对个Go程中执行,这样做减少chan传输耗时,和Go程调度耗时,性能会有很大的提升。 案例分析:nsq和nats都是实时消息队列,nsq在客户端端和服务端大量使用chan转发消息,导致性能不佳,只有100,000/s;而nats服务端在分发消息流程中,没有使用chan,只在客户端接收时使用chan,性能可达到1,000,000/s。 2.互斥锁Mutex在单Go程时Lock,Unloc...阅读全文

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

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

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

GO语言学习-匿名函数和闭包

Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用。 使用方法如下 a := func(input1 int) int{ return input1 += 1 }() b :=a(2) GO语言的匿名函数就是闭包,以下是《GO语言编程》中对闭包的解释  基本概念 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者 任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含 在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环 境(作用域)。  闭包的价值 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示 数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象...阅读全文

博文 2015-06-17 23:00:24 phlong999

golang在当前执行目录创建日志文件

package main import ( "bufio" "log" "os" "os/exec" "path/filepath" "strings" "time" ) /*获取当前文件执行的路径*/ func GetCurrPath() string { file, _ := exec.LookPath(os.Args[0]) path, _ := filepath.Abs(file) splitstring := strings.Split(path, "\\") size := len(splitstring) splitstring = strings.Split(path, splitstring[size-1]) ret := strings.Replace(splitstri...阅读全文

博文 2014-10-04 19:27:13 xlplbo

Go-Slice

要点 一个区间:[low:high] 两个概念:length, capability 三个函数:make(), append(), copy() 概念 Array是在声明的时候都确定了长度,之后不可更改。Slice和数组类似,也是表示一个有序元素,但这个序列的长度可变。 在Go中,Slice序列中各元素的数据类型必须一致,因为在声明slice的时候即要指定类型。 可以在Python中找到Slice,和Go的Slice基本上是一致的语义和用法。Slice中文通常被译为切片,大抵是因为可以从一个序列中存取指定的某一部分。下面是Collins词典中对于slice的解释,有助于了解该词的含义: N-COUNT (指食物切下的)片,薄片 A slice of bread, meat, fruit, o...阅读全文

博文 2016-09-02 07:00:05 u013344915

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

请教下 reflect.New 动态创建 struct 问题

代码如下,在不知道具体是哪个 struct 的时候,如下的代码要怎么玩? ``` package main import ( "fmt" "reflect" "github.com/vmihailenco/msgpack" ) type User struct { Id int Name string } func main() { u := &User{1, "test"} t := reflect.TypeOf(u).Elem() n := reflect.New(t).Elem().Interface() // 改成下面这样是正常的,但是在项目中并不知道是哪个结构体,也许是 Order, Pay... // ...阅读全文

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

go中struct的使用

我想问下以下两种使用struct方法怎么理解,我先写段代码: type Person struct { name string age int } func (p *Person) SetName(name string) { p.name = name } func (p *Person) SetAge(age int) { p.age = age } /** *使用&来创建新的Person,但是需要初始化值。 */ func NewPerson1() *Person { p := &Person{"lauking", 29} return p } /** *使用ne...阅读全文

如何通过reflect动态创建struct并赋值??

我通过protobuf定义了n个message结构,并通过protoc编译生成了对应的struct。 所以在xxx.pb.go中有 typedef name1 struct{......}, typedef name2 struct {...}, ......typedef nameN struct{.....} 现在,我收到了这样一条信息,name, []byte,通过name我知道了对应结构体的名字,通过[]byte我知道了对应结构体序列化后的内容,现在我要生成相应的结构体。 我查了相关资料,步骤如下: ``` package main import ( "fmt" "reflect" ) type Foo struct { name string }...阅读全文

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

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

GO语言 使用hash 表

package main import ( "fmt" ) type Data struct{ date string; value int; } func main() { fmt.Printf("hello world!\n"); var m = make(map[string]int); //创建一个空白的hash m["str1"] = 10; m["str2"] = 1000; fmt.Printf("%d\n",m["str1"]); // 遍历 hash for name,value := range m { fmt.Printf("%s\t%d\n",name,value); } ...阅读全文

博文 2015-06-17 23:07:37 juxuny

golang实现对mysql数据库的操作

一、创建表格 marksql := "create table mark (id int(20) primary key auto_increment,markname char(50)," + "mlongitude float,mlatitude float,mdescribe char(255),mtype int,creattime char(50),mvalue float );" smt, err := db.Db.Prepare(marksql) checkErr(err) smt.Exec() 二、创建外键 //定义好友fk1外键 idx_userid := "alter table user add index idx_userid(uid);" smt, err = db...阅读全文

博文 2016-03-05 14:00:02 binghunwangcong

​【币码翁】IPFS官方周报第55期

​ 欢迎关注 IPFS 周报!提请注意: 请将 URL 复制/粘贴到浏览器中打开网站。感谢您的支持!星际文件系统 (IPFS) ( https://ipfs.io/ )是一种新的超媒体分布协议,通过内容和标识来寻址。IPFS 支持创建完全分布式的应用程序。它的目标是使网络更快、更安全、更开放。由于范围广大,本周刊旨在跟踪整个生态系统的开发。想参与其中?点击下面的一些链接,查看我们在 GitHub (https://github.com/ipfs ) 上的内容,或加入我们的 IRC ( https://riot.im/app/#/room/#ipfs:matrix.org )。想要更新你的收件箱吗? 订阅我们的每周通讯( https://tinyletter.com/ipfsnewslette...阅读全文

博文 2019-08-21 16:02:51 IPFS星际特工

golang slice 创建

slice 的创建有两种方法test := []int{2,3}或者是使用make,而且通常我们使用 make创建的情况比较多例如: test := make([]int, 5, 5) // 创建一个类型为 int,长度为 5,容量为 5 的切片 fmt.Println(len(test), cap(test)) // 5 5 test1 := make([]int, 3) //如果不指定容量,默认容量等于初始时的长度 fmt.Println(len(test1),cap(test1)) // 3 3 slice 的长度和容量可以自己是可以动态改变的, slice 其实是数组的某一部分 test := make([]int,0) // 创建一个长度为0,容量为0 的数组 fmt.Printl...阅读全文

博文 2017-09-04 06:04:59 beiciye

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

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

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

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

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

【红岸智能】 -- IPFS官方周报第55期

​ 星际文件系统 (IPFS) (https://ipfs.io/ )是一种新的超媒体分布协议,通过内容和标识来寻址。IPFS 支持创建完全分布式的应用程序。它的目标是使网络更快、更安全、更开放。由于范围广大,本周刊旨在跟踪整个生态系统的开发。想参与其中?点击下面的一些链接,查看我们在 GitHub (https://github.com/ipfs ) 上的内容,或加入我们的 IRC (https://riot.im/app/#/room/#ipfs:matrix.org)。想要更新你的收件箱吗? 订阅我们的每周通讯(https://tinyletter.com/ipfsnewsletter )!以下是自上次 IPFS 周刊以来的一些亮点。最新发布改进 IPFS 发布过程go-ipfs 引入...阅读全文

博文 2019-10-17 20:35:45 aside section ._1OhGeD

golang 创建超过10万个Go程时报错stackcacherefill

package main import( //"fmt" "time" ) var c = make(chan int,100) func gofunc(){ time.Sleep(0) c<-0 } func main(){ for i:=0;i<10;i++{ for j:=0;j<10000;j++{ go gofunc() } time.Sleep(time.Second) } } fatal error: out of memory (stackcacherefill)runtime stack:runtime.throw(0x45f820) c:/go/src/pkg/runtime/panic.c:520 +0x71stackcacherefill() c:/go/src/pk...阅读全文

博文 2014-10-04 19:26:34 wkh

golang二进制协议接口映射

在写服务器程序时,特别是业务向的服务(比如游戏服务器),经常会遇到处理许多客户端协议的情况,如果是http服务,那么定义好处理接口,剩下的交给web服务器就可以了。但是二进制协议就没有这么方便了。 通常的自定义二进制协议规则都是固定长度消息头+变长消息体构成,在消息头中会有消息长度,消息id等字段。(基于TCP流式协议),服务器接收到客户端消息后,首先读取消息头,解析得到消息长度,再按照指定长度获取到完整的消息体的二进制数据。 在写具体业务逻辑时,需要面临从网络层获取到的原始数据,怎么映射到内存数据结构并调用相应处理接口的问题。前面所说的二进制消息体的格式多种多样,大家都有自己的做法,这里以protobuf为例,构建服务器端接收到原始数据后,通过消息id映射生成对应的protobuf结构体,...阅读全文

Go 语言编写轻量级网络库GrapeNet

Go 语言编写轻量级网络库 (grapeNet is a lightweight and Easy Use Network Framework) 可用于游戏服务端、强网络服务器端或其他类似应用场景,每个模块单独提取并且拥有独立的使用方法,内部耦合性较轻。 其实 GO 语言曾经有过很多强架构的框架,比如GOWOLRD之类的,已经足够了,但是我会将库用于各种轻量级应用不需要过于复杂的内容,所以我设计了GrapeNet,目的是模块独立化。 你可以拆开只使用其中很小的模块,也可以组合成一个服务端,并且在架构中设计也较为轻松,至于热更新的问题,目前脚本数据支持热更新,并且是自动的,只要跑一下UPDATE即可,程序本身稍后测试后发布(仅支持LINUX)。 本库更像是一个日常服务端开发的轻量级工具库...阅读全文

大话设计模式(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 平凡之路

go-redis in golang

func main() { //设置redis服务器地址 spac := redis.DefaultSpec().Host("202.108.33.173") log.Print("spac:", spac) //创建一个异步的client Client, err := redis.NewAsynchClientWithSpec(spac) if err != nil { log.Fatal(err) } log.Println("Redis: ", Client) //get x k := "x" futureBytes, err := Client.Get(k) if err != nil { log.Panicln(err) } v, _ := futureBytes.Get(); l...阅读全文

博文 2015-11-02 20:00:00 s630405377

大话设计模式(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 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

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

写了个协程池

# sgpool #### 介绍 协程池 #### github https://github.com/summmer-tea/sgpool #### 架构 提供两种协程池,可复用/动态创建销毁,debug模式下可以对任务的超时,失败进行统计 #### 安装 ```go go get https://github.com/summmer-tea/sgpool ``` #### 使用 具体的worker 需要实现 WorkerInterface 接口 ```go type WorkerInterface interface { Task() error GetTaskID() interface{} } ``` ##### 常驻复用协程池 `...阅读全文

golang 动态查找类型实例

关键字func和函数名之间的参数被称为receiver(接收者),将函数与接收者的类型绑在一起。如果一个函数有接收者,这个函数被称为method。不同的receiver,method可以同名这里采用封装的方法进行简述方法的妙用先看一下注册路由的方式rest.Post("/user/login", common.MakeHandler(&user.login{}))MakeHandler的方法如下,返回了一个HandlerFuncfunc MakeHandler(h Handler) rest.HandlerFunc { return func(w rest.ResponseWriter, r *rest.Request) { common_handler(w, r, h) } }具体comm...阅读全文

虚拟机创建工具Libretto-Golang

Libretto 是一个 Golang 库,可在任何云和虚拟机托管平台(如 AWS,Azure,OpenStack,vSphere 或VirtualBox)上创建虚拟机(VM)。 ![image](https://static.oschina.net/uploads/space/2017/0216/103945_SzQJ_2903254.jpg) AWS Azure DigitalOcean Exoscale Google Cloud Platform Openstack (Mirantis) Virtualbox >= 4.3.30 VMware Fusion >= 8.0 VMware Workstation >= 8.0 vSphere >...阅读全文

开源项目 2017-02-17 03:56:14 apcera

动态创建指定类型的对象,进来看代码

共享测试代码地址: http://dwz.cn/3vmUKW ```go package main import ( "encoding/json" "fmt" "reflect" ) type DynamicType struct { Id string Name string } func getTargetObject(targetType reflect.Type, rawData []byte) interface{} { ptr := reflect.New(targetType) // 问题在这里 "DynamicType" 这个类型如果我写在这里就代表不是动态创建了 // 我希望可以用 targetType...阅读全文

自己写了一个协程池

# sgpool #### github地址 https://github.com/summmer-tea/sgpool #### 介绍 协程池 #### 架构 提供两种协程池,可复用/动态创建销毁,debug模式下可以对任务的超时,失败进行统计 #### 安装 ```go go get https://gitee.com/xiawucha365/sgpool ``` #### 使用 具体的worker 需要实现 WorkerInterface 接口 ```go type WorkerInterface interface { Task() error GetTaskID() interface{} } ``` ##### 常驻复用协程池 ...阅读全文

golang创建优雅的类型定义

package main import "fmt" const ( A = 1 << iota // 1 << 0 which is 00000001 B // 1 << 1 which is 00000010 C // 1 << 2 which is 00000100 D // 1 << 3 which is 00001000 E // 1 << 4 which is 00010000 ) func main() { /* print: has A has C has E */ check(A | C | E) } func check(flag int) { if flag&A == A { fmt.Println("has A") } if flag&B == B { fmt.Prin...阅读全文

博文 2017-08-03 09:35:13 weisd

Golang之匿名函数和闭包

Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用。 使用方法如下: main.go package main import ( "fmt" ) func main() { var v func(a int) int v = func(a int) int { return a * a } fmt.Println(v(6)) //两种写法 v1 := func(i int) int { return i * i } fmt.Println(v1(7)) } GO语言的匿名函数就是闭包,以下是《GO语言编程》中对闭包的解释 基本概念闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由...阅读全文

博文 2017-12-14 07:00:01 pyyu

Go-Slice

要点 一个区间:[low:high] 两个概念:length, capability 三个函数:make(), append(), copy() 概念 Array是在声明的时候都确定了长度,之后不可更改。Slice和数组类似,也是表示一个有序元素,但这个序列的长度可变。 在Go中,Slice序列中各元素的数据类型必须一致,因为在声明slice的时候即要指定类型。 可以在Python中找到Slice,和Go的Slice基本上是一致的语义和用法。Slice中文通常被译为切片,大抵是因为可以从一个序列中存取指定的某一部分。下面是Collins词典中对于slice的解释,有助于了解该词的含义: N-COUNT (指食物切下的)片,薄片 A slice of bread, meat, fruit, o...阅读全文

博文 2016-11-17 04:00:00 u013344915