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

golang fatal error: all goroutines are asleep - deadlock!

channel默认上是阻塞的,也就是说,如果Channel满了,就阻塞写,如果Channel空了,就阻塞读。阻塞的含义就是一直等到轮到它为止。单有时候我们会收到 fatal error: all goroutines are asleep - deadlock! 异常,这是如何呢? 代码例子: package main import "fmt" func main() { channel := make(chan string, 2) fmt.Println("1") channel <- "h1" fmt.Println("2") channel <- "w2" fmt.Println("3") channel <- "c3" // 执行到这一步,直接报 error fmt.Println...阅读全文

博文 2015-02-18 03:00:00 ghj1976

妙用GO信道(channel)

channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。 这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述: 信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。 这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 channel 是一个管道或者先进先出队列,非常简单且轻量。channel 并不是 Golang 首创的。它同样作为内置功能出现在其他语言中。在大多数情况下,它是一个又大、又笨、又复...阅读全文

博文 2017-03-14 06:00:55 云迹

微服务实战(三):深入微服务架构的进程间通信

【编者的话】这是采用微服务架构创建自己应用系列第三篇文章。第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使用微服务架构的优缺点。第二篇描述了采用微服务架构应用客户端之间如何采用API Gateway方式进行通信。在这篇文章中,我们将讨论系统服务之间如何通信。 简介在单体式应用中,各个模块之间的调用是通过编程语言级别的方法或者函数来实现的。但是一个基于微服务的分布式应用是运行在多台机器上的。一般来说,每个服务实例都是一个进程。因此,如下图所示,服务之间的交互必须通过进程间通信(IPC)来实现。 后面我们将会详细介绍IPC技术,现在我们先来看下设计相关的问题。 交互模式当为某一个服务选择IPC时,首先需要考虑服务之间如何交互。客户端和服务器之间有很多的交互模式,我们可以从两个维度...阅读全文

博文 2016-03-03 10:37:45 hokingyang

Golang后台开发初体验

补充反馈 slice 既然聊到slice,就不得不提它的近亲array,这里不太想提值类型和引用类型的概念(个人觉得其实都是值类型),golang的array其实可以假想为C的struct类型,只是struct通过变量名来访问成员(如xxx.yyy),而array通过下标来访问成员(如xxx[3]),具体内存布局如下图所示: 图 1 golang的array内存布局 显然golang的array灵活性比较差,长度固定,这才有了slice,概念上有点类似于STL的vector,但是具体实现上还是有差距的,具体内存布局如下图所示: 图 2 golang的slice内存布局 slice类型存在len和cap的概念(与vector类似),这里有一点需要澄清:与vector不一样,slice的len并...阅读全文

博文 2014-10-10 18:00:07 cszhouwei

golang的类型转换的坑和分析

首先,我们来看一个例子 type Stringer interface { String() string } type String struct { data string } func (s *String) String() string { return data } 上面是类型,然后 func GetString() *String { return nil } func CheckString(s Stringer) bool { return s == nil } func main() { println(CheckString(GetString())) } 你们猜答案是什么? 当然,这么诡异的提问方式一看答案就是不合常理的false。 在CheckString里面,s是...阅读全文

博文 2016-04-09 21:00:01 cangdu

O2O,商城go2o

Go2o ================ # What's Go2o # Golang combine simple o2o DDD domain-driven design realization, including multi-channel (businesses), multi-store, multi-member commodity,Promotions, orders, coupons implementation also includes a mini-framework in package "ops/cf", providing ORM, Reporting, Web Framework,Rpc Framework. # Deploy # ##...阅读全文

开源项目 2014-12-22 02:01:04

不用翻墙也可以使用Google及Gmail,不错!!

google hosts 2015.1.5 更新,本文只提供google相关服务的hosts,目前有效,失效后会及时更新。 注1:请使用chrome浏览器,并在地址栏里输入 chrome://flags/,然后查找QUIC,启用该协议,同时建议启用SPDY/4,能让访问更流畅。 注2:请使用https的方式访问,比如:https://www.google.com 注3:默认可能会跳转到www.google.com.hk,如果.hk访问困难,请使用:https://www.google.com/ncr 方式访问,禁止国别跳转。 ====更新分界线,复制下面内容到hosts文件即可===== #google hosts 2015 by 360kb.com #base services 64.23...阅读全文

博文 2015-01-06 15:00:01 骏弛

如何优雅地关闭Go channel

本文译自:How To Close Channels in Golang Elegantly。几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评: 在不能更改channel状态的情况下,没有简单普遍的方式来检查channel是否已经关闭了 关闭已经关闭的channel会导致panic,所以在closer(关闭者)不知道channel是否已经关闭的情况下去关闭channel是很危险的 发送值到已经关闭的channel会导致panic,所以如果sender(发送者)在不知道channel是否已经关闭的情况下去向channel发送值是很危险的 那些批评看起来都很有道理(实际...阅读全文

博文 2017-02-24 07:50:55 天唯

go语言怎样开多进程图文讲解。

今天给大家讲解下go语言开多进程。 package main import ( "fmt" "time" ) var c chan int func main() { c = make(chan int) go waiting("coffee", 1) go waiting("tea", 2) fmt.Println("I,am waiting") //time.Sleep(3 * time.Second) <-c <-c } func waiting(w string, sec int) { time.Sleep(time.Duration(sec) * time.Second) fmt.Println(w, "is ready") c <- 1 } 如果进程开的比较多,怎样去避免去写多个...阅读全文

博文 2015-03-23 11:00:06 guoer9973

我们如何用Go来处理每分钟100万复杂请求的场景

在Malwarebytes 我们经历了显著的增长,自从我一年前加入了硅谷的公司,一个主要的职责成了设计架构和开发一些系统来支持一个快速增长的信息安全公司和所有需要的设施来支持一个每天百万用户使用的产品。我在反病毒和反恶意软件行业的不同公司工作了12年,从而我知道由于我们每天处理大量的数据,这些系统是多么复杂。有趣的是,在过去的大约9年间,我参与的所有的web后端的开发通常是通过Ruby on Rails技术实现的。不要错怪我。我喜欢Ruby on Rails,并且我相信它是个令人惊讶的环境。但是一段时间后,你会开始以ruby的方式开始思考和设计系统,你会忘记,如果你可以利用多线程、并行、快速执行和小内存开销,软件架构本来应该是多么高效和简单。很多年期间,我是一个c/c++、Delphi和c#...阅读全文

博文 2016-10-08 09:00:06 abv123456789

Go语言设计模式实践:迭代器(Iterator)

关于本系列 决定开个新坑。 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档、图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只能靠看标准库源代码自己琢磨,所以我特别想在这方面有一些收集和总结。 然后这个系列也是关于设计模式的。虽然Go语言不是一门面向对象编程语言,但是很多面向对象设计模式所要解决的问题是在程序设计中客观存在的。不管用什么语言,总是要面对和解决这些问题的,只是解决的思路和途径会有所不同。所以我想就以经典的设计模式作为切入点来展开这个系列,毕竟大家对设计模式都很熟悉了,可以避免无中生有想出一些蹩脚的应用场景。 本系列的具体主题会比较灵活,计划主要包括这些方面的话题: Go语言惯用法。 设计模式的实现。特别是...阅读全文

博文 2014-10-31 03:00:01 newgame

golang官方实现如何对httpserver做频率限制(最大连接数限制)

一般海量处理服务,都会对服务做个最大连接数限制,超过该限制之后,拒绝服务,避免发生雪崩,压坏服务。 使用golang来编写httpserver时,如何进行呢?官方已经有实现好的包。 使用示例: import("golang.org/x/net/netutil")l, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { fmt.Fatalf("Listen: %v", err) } defer l.Close() l = LimitListener(l, max) http.Serve(l, http.HandlerFunc()) //bla bla bla................. 源码如下(url : https://gi...阅读全文

博文 2015-03-19 16:00:01 zhangqingping

go官网的7个例子分析

go 语言或是 golang 的官网首页上有 7 个例子代码,赶脚灰常好,赶脚值得写篇文章简单分析一下 —— 虽然第 6 个例子不是太懂,貌似是个玩游戏的。 hello,世界 package main import "fmt" func main() { fmt.Println("Hello, 世界") } 这是hello,世界程序,要比hello,world其实要难一些,因为里面有中文!windows 下直接运行这个程序一般都有错误或是乱码出现,主要是编码的问题,倒不是程序的问题(请使用 utf-8 编码程序以及终端!)。关于安装以及其他细节可以看这篇文章—— 介绍 windows 下 go 环境的搭建,不仅仅是安装一下的问题。 从这个例子中,可以看出来,go 是通过 package(包)...阅读全文

博文 2014-10-24 11:38:52 陆仁贾

google hosts

google hosts 2015.2.16更新,本文只提供google相关服务的hosts,目前有效,失效后会及时更新 注1:请使用chrome浏览器,并在地址栏里输入chrome://flags/,然后查找QUIC,启用该协议,同时建议启用SPDY/4,能让访问更流畅。 注2:请使用https的方式访问,比如:https://www.google.com 注3:默认可能会跳转到www.google.com.hk,如果.hk访问困难,请使用:https://www.google.com/ncr 方式访问,禁止国别跳转。 ====更新分界线,复制下面内容到hosts文件即可===== #google hosts 2015.2.15 by 360kb.com #base services 64...阅读全文

博文 2015-02-28 03:00:01 yudishow

GO语言学习笔记一

GO语言学习笔记一 -------------------------------------------------------------------------- 优势: 1.它是系统级别的语言,静态编译,是C系列语言。 2.具有很多内置库,使用起来和Python很类似。 3.语法足够简单,入门学习成本很低,适合我这样从PHP和Python切换过来的人。 4.速度快,就拿简单的页面来说,我用PHP开发并发能够达到500很好了,但是用Go轻松就到上万,这是无法比拟的性能 提升,而且用Go开发的效率和PHP差不多。 5.出自Google之手,而且有一帮牛人在维护,基于BSD开源,社区活跃。 --------------------------------------------------...阅读全文

博文 2014-10-21 14:00:03 lvshudao

分享一个Golang 学习站点:Go by Example,示例,源码,注释

分享一个Golang 学习站点:Go by Example,示例,源码,注释 很不错的一个网站和工具。主要内容包括: 1、为 Golang 各个知识点而写的小程序(放在 play.golang.org ); 2、适当的注释; 3、整站开源,从github clone 后,读者可利用内建的工具生成本地静态文件,甚至可以生成一个网站。 网址:https://gobyexample.com/ 源码:https://github.com/mmcgrana/gobyexample 知识点目录 Hello World Values Variables Constants For If/Else Switch Arrays ...阅读全文

golang使用Nsq

为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯。一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golang原汁原味的东西,功能齐全,关键是性能还不错。其中支持动态拓展,消除单点故障等特性, 都可以很好的满足我的需求 下面上一张Nsq与其他mq的对比图,看上去的确强大。下面简单记录一下Nsq的使用方法 golang2017开发者大会 Nsq服务端 Nsq服务端简介 在使用Nsq服务之前,还是有必要了解一下Nsq的几个核心组件整个Nsq服务包含三个主要部分 nsqlookupd 先看看官方的原话是怎么说:nsqlookupd是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话...阅读全文

博文 2017-04-24 12:56:37 喵喵小魔王

golang sync.WaitGroup解决goroutine同步

go提供了sync包和channel来解决协程同步和通讯。新手对channel通道操作起来更容易产生死锁,如果时缓冲的channel还要考虑channel放入和取出数据的速率问题。 从字面就可以理解,sync.WaitGroup是等待一组协程结束。它实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就把任务从队列中移除,如果队列中的任务没有全部完成,队列就会触发阻塞以阻止程序继续运行。 sync.WaitGroup只有3个方法,Add(),Done(),Wait()。 其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。 简单示例如下: package main import ( "fmt"...阅读全文

博文 2016-12-10 11:00:06 黑神领主

golang中os/signal包的使用

os/signal包实现对信号的处理 golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。 func Notify(c chan<- os.Signal, sig ...os.Signal) func Notify(c chan<- os.Signal, sig ...os.Signal)第一个参数表示接收信号的channel, 第二个及后面的参数表示设置要监听的信号,如果不设置表示监听所有的信号。 func main() { c := make(chan os.Signal, 0) signal.Notify(c) // Block until a signal is received. s := ...阅读全文

博文 2015-06-17 20:03:59 chenbaoke

golang的缓冲channel和无缓冲channel的区别

话说golang的channel同步的定义真是让人无力吐槽,码农的用户体验就这么难搞么,超耐磨阿,无缓冲和缓冲居然有这么大区别。。。。靠 转载一段网上的资料 -------------------------------------------------------------------------------------------------------------------------------------------------------- golang channel 有缓冲 与 无缓冲 是有重要区别的 我之前天真的认为 有缓冲与无缓冲的区别 只是 无缓冲的 是 默认 缓冲 为1 的缓冲式 其实是彻底错误的,无缓冲的与有缓冲channel有着重大差别 那就是一个是同步的 ...阅读全文

博文 2014-10-04 19:26:02 ziyouchutuwenwu

对golang服务器开发模式的一些思考

多线程+同步阻塞模型 在我们的游戏项目中使用的golang服务器开发方式如下 1.多线程逻辑 2.同步阻塞. 也就是说, 每个人一个线程(goroutine), io线程=逻辑线程 这种方式的优点: 1. 同步阻塞方式与人的思维方式类同 2. 逻辑处理性能有一定提升 在大规模使用这种模式编写逻辑后, 我们发现了这种模式只有1个缺点: 编写者需要处理多线程关系 但这本身确实直接致命的, 回想C++时代, 多线程处理时, 调试重现的困难… 脑补景象太惨不敢直视 单线程+异步多进程模型 在C++时代, 我曾经编写过一套asio的C++服务器框架. 采用io多线程, 逻辑单线程, 依赖着C++高性能的优势, 让开发便捷简单且无需关心线程问题. 那么到了golang时代, 为什么不能试下单线程异步多进...阅读全文

博文 2015-10-18 03:00:06 zangao

golang中interface判断nil问题

interface数据的表示 参阅http://research.swtch.com/interfaces 在示例中,我们定义一个interface名为Stringer,同时定义一个符合其定义的Binary类型: type Stringer interface { String() string } type Binary uint64 func (i Binary) String() string { return strconv.Uitob64(i.Get(), 2) } func (i Binary) Get() uint64 { return uint64(i) } func ToString(any interface{}) string { if v, ok := any.(St...阅读全文

博文 2016-02-05 05:00:01 xiaohu50

Go 并发模型:管道和取消

简介 Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性。本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具体技术。 什么是管道 在Golang对于管道没有明确的定义;它只是许多种并发程序中的一种。管道是通道连接的一系列阶段, 每个阶段是一组goroutine运行相同的功能。在每个阶段,goroutine运行步骤为: 从上游经过入境通道接受值 对数据执行一些功能操作,通常会产生新的值 从下游经过出境通道发送值 除了开始和最后阶段只有一个入境通道或者一个出境通道外,其他每个阶段有任意数量的入境通道和出境通道,。开始阶段有时又称为源或者生产者;最后一个阶段又称为sink或者消费者。 我们将开始一个简单的示例来解...阅读全文

博文 2014-10-10 08:00:02 漠天, 徐继开, yxrykds, lidashuang,

golang中的select用法

早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回。golang在语言级别直接支持select,用于处理异步IO问题。 select用法同switch类似,如下: timeout := make (chan bool, 1)ch := make(chan int) select { case <-ch: case <-timeout: fmt.Println("timeout!") default: fmt.Println("default case is running") } 可以看出,ch初始化后,case1读取失败,timeout同样失败,因为channel中无数据,直接跳至default执行并返回。 注意,如果没有def...阅读全文

博文 2016-06-01 00:00:00 caiya928

mapreduce.go源码浅析 MIT 6.824 Spring

这学期选了《分布式系统导论》,实验部分和MIT 6.824 Spring 2015 一样,请戳, 再加上对我来说很困难的课前reading以及课后作业,压力巨大:( 实验共分5部分,根据助教往年评分来看,难度呈线性递增。 由于MIT提供的代码是由go语言所写,所以在着手实验前,你需要了解一下go,我用的是 AN INTRODUCTION TO PROGRAMMING IN GO 链接, 很薄的小册子, 可以迅速了解go语言的基本语法。 6.824 Lab 1: MapReduce 实验要求, Part 1 需要完成一个完整Word Count程序中的map函数和reduce函数, 第一步当然是读提供的代码, 把mapreduce.go中RunSingle()流程读懂,知道map函数和redu...阅读全文

博文 2015-04-07 01:00:02 b4s1cv8vc

Go语言 字符串

在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要。 Go中的字符串和C#中的一样(java也是),字符串内容在初始化后不可修改。 需要注意的是在Go中字符串是有UTF-8编码的,请注意保存文件时将文件编码格式改成UTF-8(特别是在windows下)。 初始化 var str string //声明一个字符串 str = "laoYu" //赋值 ch :=str[0] //获取第一个字符 len :=len(str) //字符串的长度,len是内置函数 ,len=5 字符串操作 编码过程中避免不了中文字符,那我们该如何提取一个中文呢?首先我们要知道string[index]获取的是字符byte,就无法像C#中"老虞"[0]来取到‘老’,在Go中需要将字符串转换成r...阅读全文

博文 2014-10-30 03:00:01 ghgyj

Go语言学习八:切片(slice)和范围(range)

// Go 语言切片是对数组的抽象。切片的单词来源于可以对其他数组和切片进行片段截取 // Go 数组的长度不可改变,在特定场景中这样的集合就不太适用, // Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"), // 与数组相比切片的长度是不固定的,可以追加元素, // 在追加时可能使切片的容量增大。 package main import "fmt" func main() { // 切片的长度和容量 var numbers = make([]int, 3, 5) //用make创建切片 printSlice(numbers) // 空(nil)切片 // 切片在未初始化时默认是nil,长度是0,容量也是0 var numbers1 []int printSlice(numbe...阅读全文

博文 2016-03-31 11:00:08 shawncheer

Golang -- 10件你不知道的事情

本文翻译 从 文章进行翻译,在此表示感谢 10 things you (probably) don’t know about golang 匿名结构体 (Anonymous structs) Template data (模板数据) data := struct { Title string Users []*User //猜测 User 是一个接口,接口指针的切片 } { title, USERS, } err := tmpl.Execute(w, data) (Cheaper and safer than using map[string]interface{}) 确实没有太理解,是什么意思? 嵌入式锁 (Embedded Lock) var hits struct{ sync.Mute...阅读全文

博文 2015-03-29 20:00:09 xiaorenwuzyh

Emacs for Go

In this post I'm going to explore customizing Emacs to make hacking on Go a little more fluid. This is a living document and will probably be updated as I discover new modes and tools. The Emacs modes I currently use are: go-mode, oracle, goflymake, and gocode. I break out my Emacs configuration into language or package specific configuration files...阅读全文

博文 2014-11-29 19:00:01 TinkerS

深入浅出Golang的协程池设计

教程制作: IT无崖子(刘丹冰) 教程简介:本教程主要针对具有一定编程基础的学员,懂得基本的编程语法。 使用Go语言实现并发的协程调度池阉割版,本文主要介绍协程池的基本设计思路,目的为深入浅出快速了解协程池工作原理,与真实的企业协程池还有很大差距,本文仅供学习参考。 一、何为并发,Go又是如何实现并发? gopool1.jpeg gopool2.jpeg 并行的好处: 同一时刻可以处理多个事务 更加节省时间,效率更高 具有并行处理能力的程序我们称之为“并发程序” 并发程序的处理能力优势体现在哪里? goPool3.jpeg 二、Go语言如何实现并发? package main import "fmt" import "time" func go_worker(name string) { f...阅读全文

博文 2018-10-14 14:34:38 IT无崖子

并发之痛 Thread,Goroutine,Actor

编者按:本文是王渊命在 2 月 27 日 Gopher 北京聚会演讲基础上整理而成,进行了一些补充以及调整,投稿给高可用架构首发。转载请注明来自高可用架构公众号「ArchNotes」。王渊命,团队协作 IM 服务 Grouk 联合创始人及 CTO,技术极客,曾任新浪微博架构师、微米技术总监。2014 年作为联合创始人创立团队协作 IM 服务 Grouk,长期关注团队协作基础工具和研发环境建设,Docker 深度实践者。聊这个话题之前,先梳理下两个概念,几乎所有讲并发的文章都要先讲这两个概念:并发(concurrency) 并发的关注点在于任务切分。举例来说,你是一个创业公司的CEO,开始只有你一个人,你一人分饰多角,一会做产品规划,一会写代码,一会见客户,虽然你不能见客户的同时写代码,但由于...阅读全文

博文 2016-03-03 10:45:22 王渊命

Go语言内置函数大全

载自 http://www.fenby.com/blog/blog/113 Package builtin import "builtin" Overview Index Overview ▾ Package builtin provides documentation for Go's predeclared identifiers. The items documented here are not actually in package builtin but their descriptions here allow godoc to present documentation for the language's special identifiers. Index ▾ Const...阅读全文

博文 2014-11-02 11:00:01 dhljs

Golang: 利用 channel (管道) 技术多线程下载图片

利用 channel (管道) 技术多线程下载图片. package main import ( "io/ioutil" "log" "net/http" "os" "regexp" //"strconv" "strings" "sync" ) var urlist = [...]string{"http://stock.591hx.com/article/2014-12-03/0000850005s.shtml"} var album chan string var w sync.WaitGroup var dir string func main() { dir = "tmp_chenjo/" err := os.Mkdir(dir, 0777) if err != nil { isex...阅读全文

博文 2015-01-19 01:00:23 kanglecjr

Go中nil

结论:由于Go中interface会同时存储类型和值,如果将一个nil对象赋值给一个interface,这个interface为非nil。 nil在Go中相当与其它语言中的NULL、null和None等,在实际的使用中表示某一个变量为空。nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果将nil赋值给其他变量的时候将会引发panic。 首先来看一个代码: package main import "fmt" type MyError struct{} func (this *MyError) Error() string { return "" } func test() error { var p *MyError = nil /* //C...阅读全文

博文 2016-02-07 12:00:01 jiaolongdy

golang里channel的实现原理

channel是消息传递的机制,用于多线程环境下lock free synchronization. 它同时具备2个特性: 1. 消息传递 2. 同步 golang里的channel的性能,可以参考前一篇:http://blog.sina.com.cn/s/blog_630c58cb01016xur.html 此外,自带的runtime package里已经提供了benchmark代码,可以运行下面的命令查看其性能: go test -v -test.bench=".*" runtime 在我的pc上的结果是: BenchmarkChanUncontended 50000000 67.3 ns/op BenchmarkChanContended 50000000 67.7 ns/op Ben...阅读全文

伙计们,Go 并没有那么简单

出于好奇,我最近开始接触一些 Go 的代码。我之前对它有一些了解,但是从来没有尝试去写(没有需求)。但是现在我们团队选择使用 Go 来开发一个项目,所以我觉得这是一个获得实际经验的好机会。 到目前为止,关于这门语言我已经学习了很长时间。在这个博文的末尾,我会写更多关于 Go 的干货。 社区实际上并不那么令人愉快,特别是那些因为它的简单性而主张使用 Go 的人。似乎简单已经成为 Go 社区中的一个流行语,许多人反复重复提到这点,却没有给出太多实际的想法。 这对我来说似乎很不幸,因为在我看来,Go 是一个“极其简单的语言”: 1. 不应该作为考虑使用 Go 的主要原因 2. 从他们的关注点中找到其他更有利的推荐理由 3. 甚至不是真的(不是真的简单) 在这篇文章中,我想围绕 Go 来分析一些简单...阅读全文

博文 2018-02-01 17:21:17 polaris

google hosts 2015

感谢互联网为所有人提供开放自由的服务,祝愿祖国繁荣富强人民安居乐业。 ------ 注1:请使用chrome浏览器,并在地址栏里输入chrome://flags/,然后查找QUIC,启用该协议,同时建议启用SPDY/4,能让访问更流畅。 注2:请使用https的方式访问,比如:https://www.google.com 注3:默认可能会跳转到www.google.com.hk,如果.hk访问困难,请使用:https://www.google.com/ncr 方式访问,禁止国别跳转。 ------ google hosts 2015.2.2 ========================================= #google-hosts-2015 #base services ...阅读全文

博文 2015-02-05 03:00:01 5tao

Go语言基础:make,new, len, cap, append, delete方法

前面提到不少go的内建函数,这篇文章学习下如何使用。。 make 先拿 make 开刀,可是一开始我就进入了误区,因为我想先找到他的源码,先是发现 src/builtin/builtin.go 中有 func make(Type, size IntegerType) Type ,可是这里只有两个参数,跟我所了解的 make 是个可变参数不太一样,于是我继续搜索源码包是否还有其它 make 函数原型的声明,但都是徒劳。 于是找度娘,一点信息都没有。还是 google 吧,找了一堆的英文解释,发现两个网站解释还可以,具体看How can the golang make function can take three parameters? 和 golang builtin package。 总的...阅读全文

博文 2016-09-20 12:00:01 uudou

golang积累-Call回调模式

一般提到回调,第一反映就是函数回调,太熟悉了。在学习golang的过程中,通过阅读相关源代码,发现golang结合channel和WaitGroup,会有非常特殊的有别于函数回调的结果返回方式,常用于相对耗时运算的结果获取。其核心思路就是利用延时信号通知,来返回。因为暂时没查到中文的定义,暂时叫做Call回调,或者叫完成通知模式。 通道组合 Call就是一个公共的可访问的结构体定义,用于包装用户请求与结果,然后通过内部额外加入的channel封装实现异步结果的返回。对使用者而言,需要知道Call的channel属性,以及框架定义的异步调用方法。 //Call定义 type Call struct { Request interface{} Reply interface{} Done cha...阅读全文

博文 2016-07-07 15:00:04 qq_26981997

golang的channel的几种用法

关闭2次 ch := make(chan bool) close(ch) close(ch) // 这样会panic的,channel不能close两次 读取的时候channel提前关闭了 ch := make(chan string) close(ch) i := <- ch // 不会panic, i读取到的值是空 "", 如果channel是bool的,那么读取到的是false 向已经关闭的channel写数据 ch := make(chan string) close(ch) ch <- "good" // 会panic的 判断channel是否close i, ok := <- ch if ok { println(i) } else { println("channel clos...阅读全文

博文 2015-05-29 03:00:00 ghj1976

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

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

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

golang中new和make区别

golang 中有两个内存分配机制 :new和make,二者有明显区别. new:用来初始化一个对象,并且返回该对象的首地址.其自身是一个指针.可用于初始化任何类型 make:返回一个初始化的实例,返回的是一个实例,而不是指针,其只能用来初始化:slice,map和channel三种类型 package main import ( "fmt" ) func main() { a := new([]int) fmt.Println(a) //输出&[],a本身是一个地址 b := make([]int, 1) fmt.Println(b) //输出[0],b本身是一个slice对象,其内容默认为0 } 通过这个例子可以看出,当对slice,map以及channel进行初始化时,使用make比n...阅读全文

Go并发编程(四)

并发基础 多进程 多线程基于回调的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常最多也不能超过1万个。这也是协程也叫轻量级线程的原因。多数语言在语法层面并不直接支持协程,而是通过库的方式支持,但用库的方式支持的功能也并不完整,比如仅仅提供轻量级线程的创建、销毁与切换等能力。如果在这样的轻量级线程中调用一个同步 IO 操作,比如网络通信、本地文件读写,都会阻塞其他的并发执行轻量级线程, 从而无法真正达到轻量级线程本身期望达到的目标。 Go 语言在语言级别支持轻量级线程,叫goroutine。Go 语言标准库提供的所有系统调用操作(当然也包括所有同步 IO 操作),都会出让 CPU 给其他g...阅读全文

博文 2015-01-22 13:00:02 anbylau2130

【转】Golang 关于通道 Chan 详解

文: http://blog.csdn.net/netdxy/article/details/54564436 在用 chan 类型时,发生死锁的错误,表面上看不出什么问题 ------------------------------------------------------------------------------------------------------- 首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。 下面我们先来看一个例子吧 import( "fmt" ) funcmain(){ go fmt.Println(...阅读全文

博文 2017-07-01 10:00:17 oxspirt

Go channel

// xuhh_go_channel project main.go /* channel 1. channel 在读取数据的时候,如果此时通道内没有数据,则会阻塞。 在取数据的时候,如果此时通道内没有数据,则也会阻塞。 2. channel 在创建的时候会存在一个数据缓冲,如果通道内存入的数据超过缓冲,则就会崩溃。 range 在遍历 channel 的时候需要注意的问题: 1. range在遍历channel的时候,一直在运行,直到close(channel)的时候才会结束调用。 2. range会一直读取数据,如果没有数据,就会阻塞在那里。 len(channel):channel内未被读取的len cal(channel):channel的容量 select机制 : 1. 检查每个c...阅读全文

golang的反射-Type

反射包主要有一个接口:type,和一个结构value; type接口 commonType类型实现了type接口,下面是type中的各类型关系 commonType>unCommonType>method arrayType|chanType|funcType|interfaceType|mapType|ptrType|sliceType >commonType ptrMap>n*commonType 其他结构 Method结构 MethodByName()和Method()会返回这种类型 type Method struct { Name string PkgPath string Type Type // method type Func Value // func with recei...阅读全文

博文 2014-10-04 19:26:08 zhepama

go语法:channel作为参数的传递

在声明channel对象的参数时,一定要写成 c chan xxx,xxx代表channel的类型。例如 package main import ( "fmt" //"time" ) func main() { c := make(chan bool, 1) for i := 0; i < 10; i++ { go Go(c, i) } <-c } func Go(c chan bool, index int) { sum := 0 for i := 0; i < 1000000; i++ { sum += i } fmt.Println(sum) c <- true } 这里的chan C变量是bool类型,所以需要在声明方法的参数时,也要加上这个bool类型。 这点跟java有所不同,刚...阅读全文

博文 2015-06-18 09:03:53 x369201170

WebSocket 和 Golang 实现聊天功能

本文同步至 http://www.waylau.com/go-websocket-chat/ 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery 创建一个简单的web聊天应用程序。这个示例的源代码在 https://github.com/waylau/goChat 。 Running the example 运行示例 这个示例需要 Golang 开发环境。 该页面描述如何安装开发环境。 一旦你去启动和运行,您可以下载、构建和运行的例子, 使用命令: go get gary.burd.info/go-websocket-chat go-websocket-chat 在支持 websocket 的浏览器尝试打开 http://127.0.0.1:8080/ 启动...阅读全文

博文 2014-11-19 09:00:02 waylau

对golang的Channel初始化的有缓存与无缓存解释

首先编程的时候遇到疑问,输出跟我所想预想不一样,后来查到了golang社区的帖子,其中一篇帖子 :健哥大人 做出了一些解释。 我摘抄重点过来: 无缓冲的与有缓冲channel有着重大差别,那就是一个是同步的 一个是非同步的。 比如 c1:=make(chan int) 无缓冲 c2:=make(chan int,1) 有缓冲 c1<-1 无缓冲: 不仅仅是向 c1 通道放 1,而是一直要等有别的携程 <-c1 接手了这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着。 有缓冲: c2<-1 则不会阻塞,因为缓冲大小是1(其实是缓冲大小为0),只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。 我对以上做一些解释,首先确实得承认channel有缓存与无缓存确实差别巨大,缓存为1...阅读全文

博文 2015-06-17 20:05:13 paladinosment

听说,你想让自己的Go程序运行的更快?

到现在为止,我已经忘记了我在写什么,但我确定这篇文章是关于Go语言的。这主要是一篇,关于运行速度,而不是开发速度的文章——这两种速度是有区别的。 我曾经和很多聪明的人一起工作。我们很多人都对性能问题很痴迷,我们之前所做的是尝试逼近能够预期的(性能)的极限。应用引擎有一些非常严格的性能要求,所以我们才会做出改变。自从使用了Go语言之后,我们已经学习到了很多提升性能以及让Go在系统编程中正常运转的方法。 Go的简单和原生并发使其成为一门非常有吸引力的后端开发语言,但更大的问题是它如何应对延迟敏感的应用场景?是否值得牺牲语言的简洁性使其速度更快?让我们来一起看一下Go语言性能优化的几个方面:语言特性、内存管理、并发,并根据这些做出合适的优化决策。所有这里介绍的测试代码都在这里.一、Channels...阅读全文

博文 2016-04-22 16:00:00 abv123456789