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

go语言的chan

chan是一个FIFO队列,chan分成两种类型同步和异步同步的chan完成发送者和接受者之间手递手传递元素的过程,必须要求对方的存在才能完成一次发送或接受异步的chan发送和接受都是基于chan的缓存,但当缓存队列填满后,发送者就会进入发送队列, 当缓存队列为空时,接受者就会接入等待队列。 chan的数据结构: struct Hchan { uintgo qcount; // total data in the q uintgo dataqsiz; // size of the circular q uint16 elemsize; uint16 pad; // ensures proper alignment of the buffer that follows Hchan in mem...阅读全文

博文 2015-05-18 03:00:01 richmonkey

golang 编译后文件变小的方法

总有人说Go程序“好大”,一个Hello World都1M多。其实,随着程序源码越来越大,编译后的文件并非那么快速的增长,这点大小真心没必要那么在乎,又不是软盘时代。但总有一些人非得想要小点。 首先我们看一下为什么会比其他语言大些: Go 编译的可执行文件都包含了一个运行时(runtime),和我们习惯的Java/.NET VM有些类似。 运行时负责内存分配(Stack Handing、GC Heap)、垃圾回收(Garbage Collection)、Goroutine调度(Schedule)、引用类型(slice、map、channel)管理,以及反射(Reflection)等工作。Go程序进程启动后会自动创建两个goroutine,分别用于执行main入口函数...阅读全文

《The Way to Go》中文版《Go入门指南》

**《The Way to Go》**经原作者授权今日起以每日一小节的进度开始翻译,中文名**《Go入门指南》**。 本书以开源书籍的形式分享在Github上,提供给有需要的Go语言爱好者。 如果有翻译不当的地方,还望大家能够 **pull request** 以为本书提供更好的翻译质量。 repo地址:[https://github.com/Unknwon/the-way-to-go_ZH_CN][1] [1]: https://github.com/Unknwon/the-way-to-go_ZH_C...阅读全文

Deno 并不是下一代 Node.js

这几天前端圈最火的事件莫过于 ry(Ryan Dahl) 的新项目 deno 了,很多 IT 新闻和媒体都用了标题:“下一代 Node.js”。这周末读了一遍 deno 的源码,特意写了这篇文章。长文预警(5000字,11图)。 0. 为什么开发 Deno? 这是我上周做的一张图,介绍了 JavaScript 的发展简史。刚才修改了一下,添加了对 Node.js 和 Deno 发布时间的标注。Node.js 和 Deno 分别是 Ryan Dahl 在 2009 年和 2018 年,基于当年最新的前端技术开发的非浏览器 JavaScript 运行时。 Ryan Dahl 开发 deno 并不是因为 “just for fun”,也不是为了取代 node。下面慢慢解释。 1. 目前 deno ...阅读全文

博文 2018-06-04 11:34:38 justjavac

如何编写一个分布式数据库

大家好, 我是开源项目 分布式 NewSQL 数据库 TiDB 和 分布式缓存 Codis 的 创始人 刘奇, 之前在京东, 豌豆荚做 infrastructure 相关的事情, 现在在创业 (PingCAP), 方向是分布式数据库. 最近如果有朋友关注开源社区或者HackerNews 的话,可能会发现一个叫 TiDB 的数据库项目吸引了一些眼球(https://github.com/pingcap/tidb ) 。 这是我们开源的第一个东西,短短几天得到了过千Star,特别感谢大家的支持和鼓励。 今天主要介绍一下 NewSQL 与 TiDB 的设计实现, 未来的一些 Roadmap 以及 一些做开源项目的心得。 大家可能经常用数据库,但是很少写一个数据库(实在是有点 hardcore),今...阅读全文

博文 2015-09-24 10:26:00 刘奇

go语言的init函数

go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性, 有下面的特征: 1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等 2 每个包可以拥有多个init函数 3 包的每个源文件也可以拥有多个init函数 4 同一个包中多个init函数的执行顺序go语言没有明确的定义(说明) 5 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序 6 init函数不能被其他函数调用,而是在main函数执行之前,自动被调用 下面这个示例摘自《the way to go》,os差异在应用程序初始化时被隐藏掉了, var prompt = "Enter a digit, e.g. 3 " + "or %s to quit." func in...阅读全文

博文 2014-10-04 19:26:31 youyou

Go 系列教程 —— 19. 接口(二)

欢迎来到 Golang 系列教程的第 19 个教程。接口共有两个教程,这是我们第二个教程。如果你还没有阅读前面的教程,请你阅读[接口(一)](https://studygolang.com/articles/12266)。 ### 实现接口:指针接受者与值接受者 在[接口(一)](https://studygolang.com/articles/12266)上的所有示例中,我们都是使用值接受者(Value Receiver)来实现接口的。我们同样可以使用指针接受者(Pointer Receiver)来实现接口。只不过在用指针接受者实现接口时,还有一些细节需要注意。我们通过下面的代码来理解吧。 ```go package main import "fmt" type Describer int...阅读全文

博文 2018-02-01 15:44:37 heyulong

golang获取调用者的方法名及所在源码行数

package main import "runtime" import "log" func main() { test() } func test() { test2() } func test2(){ pc,file,line,ok := runtime.Caller(2) log.Println(pc) log.Println(file) log.Println(line) log.Println(ok) f := runtime.FuncForPC(pc) log.Println(f.Name()) pc,file,line,ok = runtime.Caller(0) log.Println(pc) log.Println(file) log.Println(line) log....阅读全文

博文 2015-02-04 03:00:00 wangxusummer

go中方法的接收者是值或者指针的区别

值类型的变量和指针类型的变量先声明一个结构体:type T struct { Name string } func (t T) M1() { t.Name = "name1" } func (t *T) M2() { t.Name = "name2" }12345678910111234567891011M1() 的接收者是值类型 T, M2() 的接收者是值类型 *T , 两个方法内都是改变Name值。下面声明一个 T 类型的变量,并调用 M1() 和 M2() 。 t1 := T{"t1"} fmt.Println("M1调用前:", t1.Name) t1.M1() fmt.Println("M1调用后:", t1.Name) fmt.Println("M2调用前:", t1.Name...阅读全文

博文 2016-07-27 15:00:02 zlingh

golang源码解读之map

golang的map实现并不是像c++一样使用红黑树,而是使用了hashmap,用数组来实现。 详细的实现后续补充,这里先做个备忘。 在iterate整个map的时候,使用delete是安全的。这跟c++是不一样的,c++在delete的时候,会导致整棵树发生变化,所以不能在迭代的时候删除元素。 那为什么golang的map是安全的呢,从源码来看,golang的map使用了桶的概念,元素是被hash到桶存储,每个桶预设是存储八个kv,而且在头部有一个uint8 tophash[8]的结构,存储每个key的高八位(即hash(key) » (64 - 8)),如果该位置未被放置元素,则有一个特殊的标志Empty。在插入删除的时候,首先会比较该uint8跟hash(key)是否相等。当然,桶还利...阅读全文

博文 2014-10-04 19:26:15 weijiaen

golang连接kafka

golang连接kafka的例子好少,而支持offset追踪者更少,但也是基础的要求。”github.com/bsm/sarama-cluster”结合“github.com/Shopify/sarama”满足了此要求。 环境: golang 1.7 kafka 0.10 centos7.2 package main import ( "fmt" "os" "strings" "time" "github.com/Shopify/sarama" "github.com/bsm/sarama-cluster" //support automatic consumer-group rebalancing and offset tracking "github.com/golang/glog" )...阅读全文

博文 2016-11-05 03:00:01 dazheng

go中方法的接收者是值或者指针有什么区别吗?

参考文章:http://studygolang.com/articles/1113 希望解决的问题如下 假设有两个方法,一个方法的接收者是指针类型,一个方法的接收者是值类型,那么: 对于值类型的变量和指针类型的变量,这两个方法有什么区别? 如果这两个方法是为了实现一个接口,那么这两个方法都可以调用吗? 如果方法是嵌入到其他结构体中的,那么上面两种情况又是怎样的? 值类型的变量和指针类型的变量 先声明一个结构体: type T struct { Name string } func (t T) M1() { t.Name = "name1" } func (t *T) M2() { t.Name = "name2" } M1() 的接收者是值类型 T, M2() 的接收者是值类型 *T , 两...阅读全文

博文 2015-06-17 23:08:13 u013790019

D、GO、Rust 谁会在未来取代 C?为什么?

不要管我的地位和 D 语言创造者之一的身份。我会坦诚的回答这个问题。我熟悉 Go 和 Rust,并且知道 D 的缺点在哪里。我鼓励人们在 Rust 和 Go 社区相似职位的人可以提出他们诚恳的观点。接着,我们开始吧。 首先,C++ 应该放在问题的哪个位置。不管它是否取代 C,或是成为取代 C 的候选人之一,C++ 是这个等式的一个关键部分。它是最接近 C 的,同时也是从 C 中来的。在下面几个问题中我会假设 C++ 是把取代 C 作为目标的。 每一个语言都有一些基础优势(我称之为“十倍优势”,因为在一定的基准上比较其他确实效率更高)和数个挑战。这些语言在未来能否取代 C 语言取决于它们如何利用它们的十倍优势,并且如何克服他们的数个挑战...阅读全文

博文 2015-11-10 19:00:00 babybright123, coding12, 你是晴天, 弃天帝, 机智的祺祺, Iam魔方

Go 系列教程 —— 29. Defer

欢迎来到 [Golang 系列教程](https://studygolang.com/subject/2)的第 29 篇。 ## 什么是 defer? `defer` 语句的用途是:含有 `defer` 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,我们通过一个示例就很容易明白了。 ## 示例 ```go package main import ( "fmt" ) func finished() { fmt.Println("Finished finding largest") } func largest(nums []int) { defer finished() fmt.Println("Started finding largest") max := ...阅读全文

博文 2018-03-30 23:05:21 heyulong

golang中的格式化输入输出

【简介】 fmt 包实现了格式化 I/O 函数,类似于 C 的 printf 和 scanf。格式“占位符”衍生自 C,但比 C 更简单。 【打印】 占位符: [一般] %v 相应值的默认格式。在打印结构体时,“加号”标记(%+v)会添加字段名 %#v 相应值的 Go 语法表示 %T 相应值的类型的 Go 语法表示 %% 字面上的百分号,并非值的占位符 [布尔] %t 单词 true 或 false。 [整数] %b 二进制表示 %c 相应 Unicode 码点所表示的字符 %d 十进制表示 %o 八进制表示 %q 单引号围绕的字符字面值,由 Go 语法安全地转义 %x 十六进制表示,字母形式为小写 a-f %X 十六进制表示,字母形式为大写 A-F %U Unicode 格式:U+1234...阅读全文

博文 2016-06-01 11:00:01 xiaoyida11

Golang 中函数和方法的区别

golang 函数以及函数和方法的区别 原创 2016年12月11日 20:12:54 4363 在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中者完全是两个不同的东西。官方的解释是,方法是包含了接收者的函数。到底什么意思呢。 首先函数的格式是固定的,func+函数名+ 参数 + 返回值(可选) + 函数体。例 func main() { fmt.Println("Hello go") } 在golang中有两个特殊的函数,main函数和init函数,main函数不用介绍在所有语言中都一样,它作为一个程序的入口,只能有一个。init函数在每个package是可选的,可有可无,甚至可以有多个(但...阅读全文

博文 2018-01-23 22:33:04 coder_kev

【go语言】Goroutines 并发模式(一)

前言 由于前一阶段实习中接到的项目的告一段落,不知不觉便多出了许多空余的时间,于是就想总结一下最近因为个人兴趣而学习的一些东西。从这篇文章开始以及后面陆续的几篇关于GO语言的文章,均是博主最近对GO语言学习过程中的一些感悟、总结,类似于学习笔记的东西。记录下来并整理成博客一为对学习的知识做一个整理,二为分享出来给大家(因为国内关于GO语言的中文资料比较少),由于博主能力和知识有限,难免有所靡误,还望勘正。 由于Go最近一系列出色的表现,从一开始Go便紧紧地吸引住了我的眼球。类似于Erlang、Scala等语言,Go也是天生为并发而设计的语言,Go有着许多在原生层面对并发编程进行支持的优秀特性,比如大名鼎鼎的Goroutines、Channels、Select等原生特性。那么废话不多说,这一篇...阅读全文

博文 2014-10-04 19:26:21 何良瑞Nyanko君

golang arm 交叉编译

set GOOS=linux set GOARCH=arm cd go/src make.bat cd .. cp bin/%GOOS%_%GOARCH% %GOROOT%/bin -r cp pkg/%GOOS%_%GOARCH% %GOROOT%/pkg -r cp pkg/tool/%GOOS%_%GOARCH% %GOROOT%/pkg/tool -r 使用百度手机助手,开启USB调试:点击多次“版本号”,开发者选项->启用USB调试 使用百度手机助手的bdadb.exe shell,进入后su,手机上赋予root权限 cp /sdcard/download/linux_hello /data/ chmod 777 /data/linux_hello (sdcard是fat32格式,...阅读全文

博文 2015-03-17 09:00:01 chuqingq

golang并发编程实践 -- 简单生产者消费者(with chan)

本文简单介绍如何用golang实现经典的生产者消费者模型。 golang语法简洁,凡可以通过几行代码解决的事情,绝不为了解决该问题而在语言中引入不必要的特性。这个和c++正好相反,c++是个庞大的怪物,我这么形容可能很多c++的fans心里要不舒服了,为了让你在看到诸如子类言论时能够心平气和,建议大家使用一下golang吧。本文不是介绍golang编程语言本身的文章,而是从golang如何让并发编程变得容易...阅读全文

博文 2014-10-04 19:26:04 aura521521

为什么Go在中国这么流行?

文章根据谷歌的trends,国内Go相关网站的Alexa以及Baidu的golang搜索排名等分析Go在中国流行的可能原因。其中提到本社区:studygolang.com 是中国Go社区的领跑者。 看到这篇文章很激动,很久没有维护该社区了,接下来会好好维护,争取做成Golang在国内最好、最大的社区。 文章地址:[why-is-go-popular-in-china](http://herman.asia/why-is-go-popular-in-china) ...阅读全文

golang 函数一 (定义、参数、返回值)

对于GoLang函数的定义或者说理解:函数是结构化编程中最小的模块单元,日常开发过程中,将复杂的算法过程分解为若干个小任务(代码块),使程序的结构性更清晰,程序可读性提升,易于后期维护和让别人读懂你的代码。另外为了更好的重用你的代码,可以把重复性的任务抽象成一个函数。Go语言中使用关键词func来定义一个函数,并且左花括号不能另起一行,比如:func hello(){ //左花括号不能另起一行 println("hello") }Go语言中定义和应用函数时,有如下需要注意的点: 函数无须前置声明 不支持命名嵌套定义,支持匿名嵌套 函数只能判断是否为nil,不支持其它比较操作 支持多返回值 支持命名返回值 支持返回局部变量指针 支持匿名函数和闭包func hello() { //左括号不能另起...阅读全文

博文 2017-02-10 11:05:00 100018

GO语言结构体方法跟结构体指针方法的区别

首先,我定了三个接口、一个结构和三个方法: type DeptModeA interface { Name() string SetName(name string) } type DeptModeB interface { Relocate(building string, floor uint8) } type Dept struct { name string building string floor uint8 Key string } func (self Dept) Name() string { return self.name } func (self Dept) SetName(name string) { self.name = name } func (self *D...阅读全文

博文 2017-01-18 16:00:08 tree2013

MQTT 代理 SurgeMQ

SurgeMQ 旨在提供 MQTT 代理和客户端开发包,完全兼容 MQTT sepc 3.1.1,此外尝试兼容 3.1。SurgeMQ 目前开发活跃,在一台 4 核 2.8G i7 处理器的 MBP 上性能可达: * **over 400,000** MPS in a 1:1 单发布者和生产者配置 * **over 450,000** MPS in a 20:1 fan-in configuration * **over 750,000** MPS in a 1:20 fan-out configuration * **over 700,000** MPS in a full mesh configuration with 20 clients ![image](http://st...阅读全文

go语言:函数参数传递详解

参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。比较常见的参数传递有:值传递,按地址传递参数或者按数组传递参数。 1、常规传递 使用普通变量作为函数参数的时候,在传递参数时只是对变量值得拷贝,即将实参的值复制给变参,当函数对变参进行处理时,并不会影响原来实参的值。 例如: package main import ( "fmt" ) func swap(a int, b int) { var temp int temp = a a = b b = temp } func main() { x := 5 y := 10 swap(x, y) fmt.Print(x, y) } 输出结果:5 10 传递给swap的是x,y的值得拷贝...阅读全文

博文 2016-07-03 02:00:01 chase-wind

go语言生产者,消费者事例

package main import "fmt" import "time" func main() { // ch := make(chan int, 10) ch := make(chan int) go produce("生产者1",ch) go produce("生产者2",ch) time.Sleep(1 * time.Second) go use(ch) time.Sleep(101 * time.Second) } func produce(pname string,ch chan int) { for i:= 0;i < 20;i++ { fmt.Println("produce", pname ," : ", i) ch <- i // 这里需要在打印语句之后,否者可能产...阅读全文

博文 2014-10-23 18:00:00 eclipser1987

golang: Martini之inject源码分析

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中,调用者是自己来决定使用哪些被调用者实现的。但是在依赖注入模式中,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由注入器来完成,然后注入调用者,因此也称为依赖注入。 inject 是依赖注入的golang实现,作者是 codegangsta 。它能在运行时注入参数,调用方法。是Martini框架的基础核心。 我对依赖注入提取了以下2点性质: 由注入器注入属性。 由注入器创建被调用者实例。 在inject中,被调用者为func,因此注入属性也即对func注入实参(当然inject也可以注入struct,这样的话注入的属...阅读全文

博文 2014-10-04 19:27:00 陈一回

理解 Go 语言中的方法和接收者

0x01 前言 Go 语言的语法实在有些不一样,与其它面向对象语言相比,Go 的方法似乎有些晦涩。 0x02 方法的定义 在 Go 语言里,方法和函数只差了一个,那就是方法在 func 和标识符之间多了一个参数。 type user struct { name string, email string, } //这是函数的定义 func notify(email string) { fmt.Println("Email is %s", email) } //这是方法的定义 func (u user) notify(email string) { fmt.Println("Email is %d", email) } 我们可以看到,方法是在 func 和 notify 之间多了一个 user ...阅读全文

博文 2017-06-03 09:05:56 daryl

go interface的一点心得

先看golanger.com关于interface的说明 *Interfaces in Go provide a way to specify the behavior of an object: if something can do this, then it can be used here* 翻译下来就是: interfaces 用来指定一个object的的行为,如果该object能够执行该行为,这个接口就可以替代这个对象。 文档中举了一个例子: fmt包中的Fprintf方法 `func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)...阅读全文

Go语言中的多维数组传递

在Go语言中,当多维数组直接作为函数实参进行参数传递的时候,会有很大的限制性,比如除第一维数组的其他维数需要显式给出等;此时可以使用多维切片来作为参数传递: type s1 []int type s2 []s1 剑指offer一书面试题3: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下的顺序排序。完成一个函数,输入二维数组和要查找的数,判断该数是否存在于二维数组中。 代码: package main import ( "errors" "fmt" "os" ) type s1 []int type s2 []s1 var searchErr error = errors.New("search error") func main() { a := s2{ s1{1...阅读全文

博文 2016-05-13 08:00:02 air_upc

Sprite Kit游戏框架(go语言也该雄起了)

在iOS 7中内置了一个新的Sprite Kit框架,该框架主要用来开发2D游戏。目前已经支持的内容包括:精灵、很酷的特效(例如视频、滤镜和遮罩),并且还集成了物理库等许多东西。iOS 7中附带了一个非常棒的Sprite Kit示例工程,名字叫做Adventure。不过这个示例工程稍微有点复杂,不太适合初学者。本文的目的就是做一个关于Sprite Kit使用的初级教程。 通过本文,你可以从头到尾的学习到如何为你的iPhone创建一个简单又有趣的2D游戏。如果你看过我们之前的教程:Simple Cocos2D game教程,你会发现非常的相似。在开始之前,请确保已经安装了最新版本的Xcode(5.X),里面支持Sprite Kit以及iOS 7。 Sprite Kit的优点和缺...阅读全文

golang byte 操作

21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> byte数组转int // bytes to int 32 func bytesTo32Int(b []byte) int { buf := bytes.NewBuffer(b) var tmp uint32 binary.Read(buf, binary.BigEndian, &tmp) return int(tmp) } // bytes to int 16 func bytesTo16Int(b []byte) int { buf := bytes.NewBuffer(b) var tmp uint16 binary.Read(buf, binary.BigEndian, &tmp) return in...阅读全文

博文 2018-09-01 14:33:13 Robin3D

Go1.7改善了编译速度并且会生成更快的代码

Go1.7的开发周期正在接近它的下一个里程碑,Go的提交者Dave Cheney报告了子即将发布的版本中,团队成员在语言工具链上的努力。 Cheney称,基于当前的开发状态,Go1.7将会很容易就成为最好的Go发布版本。提升工具链的努力主要聚焦在如下两个方面: 编译和链接的时间; 代码生成。 当谈到编译时间,Go编译器自从C转到了Go的影响而一直以来的较慢的性能。这个问题已经被讨论很多次并且最近的完成的工作目标就是减少编译器内存使用来改善链接时间。这项改进和Go1.5.3相比大约减少了20-30%的总编译时间,如下图所示: 代码生成,如上文所述,是Go1.7的另一个主要关注点。新的后端改用SSA,和LLVM以及其他编译器着的一样,以启用代码生成的很多优化。这些优化包含更好的无用代码的消除,寄...阅读全文

golang结构体-对象和指针-函数赋予

1、定义一个结构体type User struct { userid int username string password string} 2、初始化一个结构体 有两种情况,一是得到结构体的对象,一是得到结构的对象指针,分别有三种方式: //第1种方式,先声明对象,再初始化 var player1 Player player1.userid = 1 player1.username = "lina1" player1.password = "123456" //第2种方式,声明同时初始化 player2 := Player{2, "lina2", "123456"} //第3种方式,通过 field:value 形式初始化,该方式可以灵活初始化字段的顺序 player3 := Playe...阅读全文

博文 2018-08-15 20:36:41 amu_lucifer

Go语言 Go加密之DES

接着RSA加密解密,我们继续来看看DES的加密解密 一、DES简介 DES(Data Encryption Standard)是对称加密算法,也就是加密和解密用相同的密钥。其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。 DES加密,涉及到加密模式...阅读全文

博文 2015-06-17 23:01:48 abv123456789

golang并发编程实践 -- 简单生产者消费者(with lock)

上一篇文章用golang中的channel实现了简单的消费者模型,下面的版本是用传统的锁技术实现的版本,相对比会发现golang提供的channel更好用。而且golang的channel可以完成很多在别的语言里需要很多代码才能实现的功能。以后陆续解答。 package main import ( "fmt" "sync" "time" ) type Queue struct { Elem []int Capacity int Front int Rear int Lock sync.Locker Cond *sync.Cond } func New() *Queue { theQueue := &Queue{} theQueue.Capacity = 10 theQueue.Elem = ...阅读全文

博文 2014-10-04 19:26:11 aura521521

Golang的值类型receiver和指针类型receiver

Golang的值类型和指针类型receiver一直让我比较混淆,在此做几个试验备忘 先看指针类型的receiver: package main import ( "fmt" ) type BasicEvent struct { EventId int } func (ev *BasicEvent) updateEventID(id int) { ev.EventId = id } func main() { ev1 := &BasicEvent{EventId: 1} fmt.Printf("before update id = %d\n", ev1.EventId) ev1.updateEventID(2) fmt.Printf("After update id = %d\n", ev1....阅读全文

博文 2015-04-23 15:00:01 miros

用GO实现的改进的观察者模式

废话不说。上代码: Publisher.go: package main import ( "container/list" ) type Handler interface {//这里主要参考了Go里HTTP包的实现 Serve(int) } type HandlerFunc func(args int) func (f HandlerFunc) Serve(args int) {//是不是很熟悉的代码? f(args) } type Publish struct { HandlerFuncs *list.List Value int } func NewPublisher() *Publish { p := new(Publish) p.HandlerFuncs = list.New()...阅读全文

博文 2015-06-18 09:02:16 zha_stef

Go 的开源博客平台Pipe

Pipe 是一款使用 Go 语言编写的开源博客平台。 **动机** 产品层面: 市面上缺乏支持多独立博客的平台级系统 实现 [B3log 构思](https://hacpai.com/b3log) 技术层面: 在博客系统这个轮子上充分发挥 golang 的优势 后台使用 Vue.js 进行前后端分离 **特性** 多用户博客平台 Markdown / Emoji 聚合分类 / 标签 自定义导航 多主题 / 多语言 Atom 订阅 可配置动静分离 搜索 Hexo/Jekyll 导入 / 导出 **算力** Pipe 默认会通过浏览者的浏览器进行挖矿(只会使用空闲的 CPU 资源,并且占用很低),收益将用于维持项目运维。原理请参考[使用访问者浏览器挖矿的...阅读全文

go语言的time包

go语言的time包 组成 time.Duration(时长,耗时) time.Time(时间点) time.C(放时间点的管道)[ Time.C:=make(chan time.Time) ] time包里有2个东西,一个是时间点,另一个是时长 时间点的意思就是“某一刻”,比如 2000年1月1日1点1分1秒 那一刻(后台记录的是unix时间,从1970年开始计算) 时长就是某一刻与另一刻的差,也就是耗时 函数 Sleep函数 time.Sleep(time.Duration) 表示睡多少时间,睡觉时,是阻塞状态 fmt.Println("start sleeping...") time.Sleep(time.Second) fmt.Println("end sleep.") //【结果】...阅读全文

博文 2014-10-04 19:26:01 waynehu

观察者模式 Go语言实现

模式组成: 观察者模式包含如下角色: 目标(Subject): 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 具体目标(ConcreteSubject): 将有关状态存入各ConcreteObserver对象。 观察者(Observer): 为那些在目标发生改变时需获得通知的对象定义一个更新接口。当它的状态发生改变时, 向它的各个观察者发出通知。 具体观察者(ConcreteObserver): 维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现O b s e r v e r的更新接口以使自身状态与目标的状态保持一致。 效果: Observer模式允许你独立的改变目标和观察者。你可以单独复用目...阅读全文

博文 2016-04-18 12:00:06 readen

Go1.6与JVM CMS的垃圾回收对比

自从Go1.5引入了真正的并发GC后, Go1.6进一步进行了优化,使得Go在上百G级的堆大小时依然能将STW时间控制在20ms以内: 而Java8的G1收集器,默认参数下在100G以上的heap下,会造成秒级的STW。虽然可以通过-XX:MaxGCPauseMillis调整,但是是以牺牲大量吞吐量为代价。这里浅析一下Go能做到比G1更短的STW的原因。 轮流挂起协程 JVM的CMS收集器在工作时,大致分为4个阶段: 初始标记 并发标记 重新标记 并发清除 其中1, 3 是需要STW的阶段,CMS的停顿也是由这2个阶段引发的。Go1.5中的CMS也分为这些阶段,其中1, 3同样需要STW。那为什么Go会停顿时间更少呢?原因是,Go的CMS在第3阶段并不是挂起所有goroutine,而是轮流挂...阅读全文

博文 2016-04-21 19:00:01 tracker_w

Golang分布式设计模式之-----星型拓扑分形设计

Golang分布式设计模式之-----星型拓扑分形设计 上一篇分层设计中,利用了简单的流水线原理,实现了简单的状态转移的设计。如下 这一篇我们将考虑另外一种情况。例如,linux内核中的进程管理。所有的进程都有一个父进程。当子进程正常运行时候,与父进程基本无通信。但当子进程死亡时,要通知其父进程,让父进程进行资源回收。当父进程死亡时,两种情况,子进程随着父进程一起死亡,或者将子进程交由父进程的父进程管理。类似于下图 其中每个进程都有自己的父进程,也有可能会有自己的子进程。 在这种管理中,父子关系,或者说是管理者与被管理者的关系。被管理者,可以独自运行,但要将其的一些状态告知管理者,或者管理者,可以定期获取被管理者的状态。 下面以一个p2p下载器为例: 一、职能划分,形成管理者与被管理者 1)...阅读全文

博文 2015-01-21 09:17:51 screscent

golang学习的点点滴滴:指针,地址,形参,实参

学习Go语言的过程中,会发现它的指针,地址,还有函数参数跟平常我们理解的不太一样. 上代码: package main //学习指针用法 import ( "fmt" ) func main() { var i int; // i 的类型是int型 var p *int; // p 的类型是[int型的指针] i = 1; // i 的值为 1; p = &i; // p 的值为 [i的地址] fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p); *p = 2; // *p 的值为 [[i的地址]的指针](其实就是i嘛),这行代码也就等价于 i = 2 fmt.Printf("i=%d;p=%d;*p=%d\n",i,p,*p); i = 3; // 验证我的想法 ...阅读全文

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

小米即时消息云 SDKMIMC

小米即时消息云MIMC:xiaoMI Messaging Cloud MIMC是小米自研的一种安全、可靠、易用的分布式IM云服务。为广大开发者提供免费快捷的即时通讯接入服务。MIMC基于多年小米通讯技术积累,让即时通讯不再复杂。 目前开发者可在PC端打开链接小米开放平台查看小米即时消息云的介绍和API接入文档,SDK下载等。 [https://dev.mi.com/console/appservice/mimc.html](https://dev.mi.com/console/appservice/mimc.html) ![image](https://static.oschina.net/uploads/img/201801/30142337_jLhU.jpg...阅读全文

开源项目 2018-12-05 11:30:02 网友

第二届Gopher大会即将在北京举行,就等你来

去年我们在上海举行了第一届Gopher大会,那一次大会参会人员在500人左右,会后大家都觉得这是参加过的最实在,最物超所值,干货最多的大会。这里有去年参会的人员写的一些回顾,大家可以体会当时的情形 - http://thinkandcode.info/gopherchina2015can-hui-ji-lu/ - http://fuxiaohei.me/2015/4/29/gopher-china-2015.html - http://life.leanote.com/post/gopher-china-2015-my-golang-way 说了那么多,回到我们今年这一届的大会,因为北京可以说是中国的互联网中心,这里有着大量的Go使用者,而且我去年也答应了很多北京的同学,...阅读全文

chinapub读书会第3期:GO语言与Docker技术分享会

活动安排 主办方: 时间:2015年04月25日(周六) 13:00-17:30 地点:北京丰台区成寿寺路11号邮电出版大厦。乘坐300快外、特8外快,、300外到方庄桥东站下车,往南200米路西。 活动嘉宾 郝林 Gopher、高级Java软件工程师、Python程序员和Linux爱好者。目前在北京数人科技有限公司任资深技术工程师,从事大数据处理平台的研发工作。曾就职于宜信、搜狐网,并先后担任软件架构师和技术主管等职务。在互联网软件的设计和开发方面拥有丰富的实战经验。 刘斌 具有10余年软件开发经验,关注后台开发技术和各种编程语言。做过电子商务、金融、企业系统以及Android手机开发;写过Delphi,也兼做系统管理员和DBA。 沈峰 看准网数据组组长,数据工程师 活动流程 13:00 ...阅读全文

博文 2015-04-20 18:00:09 chinapub_2009

golang x.(type) 用法

21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> golang中x.(type)只能在switch中使用 func MyPrintf(args ...interface{}) { for _, arg := range args { switch arg.(type) { case int: fmt.Println(arg, "is an int value.") case string: fmt.Println(arg, "is a string value.") case int64: fmt.Println(arg, "is an int64 value.") default: fmt.Println(arg, "is an unknown type....阅读全文

博文 2018-09-01 14:33:12 Robin3D