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

Goroutine + Channel 实践

背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Beego框架进行开发。之所以选择Golang,主要是考虑到开发的模块,都需要接受瞬时大并发、请求需要经历多个步骤、处理时间较长、无法同步立即返回结果的场景,Golang的goroutine以及channel所提供的语言层级的特性,正好可以满足这方面的需要。 goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread的实现也不尽相同;但是,操作系统并不知道goroutine的存在,goroutine的调度是有Golang运行时进行管理的。启动thread虽然比process所需的资源要少,但是多个thread之间...阅读全文

博文 2015-02-25 12:37:01 Qu Xiao

golang 利用http.Client POST数据

package main import ( "fmt" "io/ioutil" "net/http" "net/url" "strings" ) func main() { v := url.Values{} v.Set("huifu", "hello world") body := ioutil.NopCloser(strings.NewReader(v.Encode())) //把form数据编下码 client := &http.Client{} req, _ := http.NewRequest("POST", "http://192.168.2.83:8080/bingqinggongxiang/test2", body) req.Header.Set("Content-Type"...阅读全文

博文 2014-11-24 11:00:01 别人说我名字很长

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

基于go语言的消息推送系统架构分析

本系统是猎豹移动基于go语言开发的一套消息推送系统,源码地址:https://github.com/Terry-Mao/goim 一、架构图 二、功能简介 1.comet 长连接服务器,支持长轮训、tcp、websocket连接,有超时机制 2.logic 逻辑处理服务器,消息推送入口,通过userId在router服务器中查找对应的comet服务器,将serverId和消息一起保存到kafka队列,logic是无状态服务器,可以随意增删,因为comet需要连接logic,所以在comet服务器中需要连接logic的通过LVS的虚IP,LVS加了real server后不会断开,所以需要在comet服务触发SIGHUP,重新load配置文件。 3.router 路由服务器,保存userId和...阅读全文

博文 2015-10-24 19:00:05 qinyongbo

《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...阅读全文

golang--gin获取post里body的参数

如题,post发送数据有几种形式,form和流是最常用的。特别是在程序里使用httpclients,一般都算通过流发送。在php里,是通过php://input来获取的。在gin中,可以通过c.Request.Body.Read(buf)。具体代码如下: package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.POST("/events", events) router.Run(":5000") } func events(c *gin.Context) { buf := make([]byte, 1024) n, _ :=...阅读全文

博文 2016-09-10 03:00:03 Manrener

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

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

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

golang 速度限制,time.Tick(time.Second*2) channel,隔2秒后继续执行

package main import ( "fmt" "time" ) func main() { requests := make(chan int, 5) for i := 1; i <= 2; i++ { requests <- i } close(requests) limiter := time.Tick(time.Millisecond * 200) for req := range requests { //会循环两次,前面往requests channel中发送了两个值 <-limiter //执行到这里,需要隔 200毫秒才继续往下执行,time.Tick(timer)上面已定义 fmt.Println("request", req, time.Now()) } burs...阅读全文

博文 2015-04-18 03:00:00 benlightning

go channel实现

go channel实现 转载自:http://alpha-blog.wanglianghome.org/2012/04/13/go-channel-implementation/ G语言经过多年的发展,于最近推出了第一个稳定版本。相对于C/C++来说,Go有很多独特之出,比如提供了相当抽象的工具,如channel和goroutine。本文主要介绍channel的实现方式。 简介 channel有四个操作: 创建:c = make(chan int)发送:c <- 1提取:i <- c关闭:close(c) 根据创建方式的不同,channel还可分为有buffer的channel和没有buffer的channel。buffer的大小由make的第二个参数指定,默认为0,即没有buffer。创...阅读全文

博文 2014-10-06 16:37:04 kai_ding

Go语言爬虫

之前写爬虫都是用的python语言,最近发现go语言写起来也挺方便的,下面简单介绍一下。这里说的爬虫并不是对网络中的很多资源进行不断的循环抓取,而只是抓通过程序的手段都某些网页实现特定的信息抓取。可以简单分成两个部分:抓取网页,对网页进行解析。抓取网页。一般是向服务器发送一个http get/post请求,得到response。go提供的http包可以很好的实现。get方法:1resp, err := http.Get(“http://www.legendtkl.com") post方法:12resp, err := http.Post(“http://example.com/upload”, “image/jpg”, &buf)resp, err := http.PostForm(...阅读全文

博文 2017-07-02 19:22:57 Tao Kelu

Go 系列教程 —— 24. Select

欢迎来到 [Golang 系列教程](https://studygolang.com/subject/2)的第 24 篇。 ## 什么是 select? `select` 语句用于在多个发送/接收信道操作中进行选择。`select` 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,`select` 会随机地选取其中之一执行。该语法与 `switch` 类似,所不同的是,这里的每个 `case` 语句都是信道操作。我们好好看一些代码来加深理解吧。 ## 示例 ```go package main import ( "fmt" "time" ) func server1(ch chan string) { time.Sleep(6 * time.Second) ch <-...阅读全文

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 实现tcp转发代理

package main import ( "flag" "fmt" "io" "net" "os" "strings" "sync" ) var lock sync.Mutex var trueList []string var ip string var list string func main() { flag.StringVar(&ip, "l", ":9897", "-l=0.0.0.0:9897 指定服务监听的端口") flag.StringVar(&list, "d", "127.0.0.1:1789,127.0.0.1:1788", "-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开") flag.Parse() tr...阅读全文

博文 2016-06-08 20:00:00 fyxichen

[golang]GO语言编写的基于UDP协议的简易聊天软件

初学GO不到两周,本着熟悉语言的目标写了这个小程序,漏洞很多,实现上写的也有些渣渣,欢迎大家阅读指点。 下载地址:https://github.com/yinxin630/gochat 简单思路描述: 0、服务端监听客户端请求,完成会话转发的任务 1、服务端采用心跳包维护用户在线状态 2、客户端通知服务端自己的监听地址,创建服务端-客户端信息通道 服务端: package main import ( "fmt" "net" "os" "strconv" "time" ) //用户信息 type User struct { userName string userAddr *net.UDPAddr userListenConn *net.UDPConn chatToConn *net.UDPC...阅读全文

博文 2014-11-11 06:00:06 u011229962

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

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

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

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魔方

[golang]为什么Response.Body需要被关闭

Body io.ReadCloser The http Client and Transport guarantee that Body is always non-nil, even on responses without a body or responses with a zero-length body. It is the caller's responsibility to close Body. The default HTTP client's Transport does not attempt to reuse HTTP/1.0 or HTTP/1.1 TCP connections ("keep-alive") unless the Body is read to c...阅读全文

博文 2017-05-28 16:07:41 一桶冷水

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

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

Golang实现简单tcp服务器04 -- 服务器的粘包处理

服务器的粘包处理 什么是粘包 一个完成的消息可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题 TCP粘包和拆包产生的原因 应用程序写入数据的字节大小大于套接字发送缓冲区的大小 进行MSS大小的TCP分段。MSS是最大报文段长度的缩写。MSS是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是TCP报文段的最大长度,而是:MSS=TCP报文段长度-TCP首部长度 以太网的payload大于MTU进行IP分片。MTU指:一种通信协议的某一层上面所能通过的最大数据包大小。如果IP层有一个数据包要传,而且数据的长度比链路层的MTU大,那么IP层就会进行分片,把数据包分成托干片,让每一片都...阅读全文

博文 2015-06-02 23:00:16 victoriest

为什么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 使用 gomail 发送邮件

下面以阿里云邮箱为例, 如果使用的是qq邮箱的话需要把mailConn里面的host改成'smpt.qq.com',user 填写qq邮箱地址, pass需要填写你在qq邮箱设置里面获取到的授权码,qq邮箱需要先去邮箱设置里面开通smtp支持,然后获取授权码。然后就可以用qq邮箱发送了。 安装gomail go get gopkg.in/gomail.v2 package main import ( "gopkg.in/gomail.v2" "strconv" ) func SendMail(mailTo []string,subject string, body string ) error { //定义邮箱服务器连接信息,如果是阿里邮箱 pass填密码,qq邮箱填授权码 mailConn...阅读全文

博文 2018-11-06 18:35:49 woahjknes

golang 网络通信

title: golang 网络编程 golang 网络编程 go-shadowsocks是一个非常好的学习golang网络编程的例子。在本篇博文中重点阐述golang网络通信几个各种不同协议下服务端和客户端的实现。网络通信协议主要有以下两种外加一种增加的协议 golang tcp golang upd golang kcp:在upd上进行增强的协议,KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。 golang的一大优势就是多核、并行、网络编程。通过goroutine与channel可以很方便地协程,协程比线程更轻量级,占用资源更小,可以更好地适用与并行计算。 下面对这三种分别进行说明。 golang...阅读全文

博文 2017-07-15 04:06:26 bradyjoestar

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中使用linked channels进行数据广播

在go中使用linked channels进行数据广播 原文在这里(需翻墙),为啥想要翻译这篇文章是因为在实际中也碰到过如此的问题,而该文章的解决方式很巧妙,希望对大家有用。 在go中channels是一个很强大的东西,但是在处理某些事情上面还是有局限的。其中之一就是一对多的通信。channels在多个writer,一个reader的模型下面工作的很好,但是却不能很容易的处理多个reader等待获取一个writer发送的数据的情况。 处理这样的情况,可能的一个go api原型如下: type Broadcaster … func NewBroadcaster() Broadcaster func (b Broadcaster) Write(v interface{}) func (b Bro...阅读全文

博文 2014-10-15 13:52:44 siddontang

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 支付宝SHA1withRSA加密

SHA1大家用的挺多,RSA不多但用的也有,但像支付宝这样要求 SHA1 + RSA的恐怕就没几个了,写起来实在痛苦。而且一搜一片,却没几个能跑起来的。 刚才有个人在QQ上加我,问之前在支付宝集成的帖子里的SHA1withRSA是咋解决的。说实话,不是专门研究加密的,鬼知道报的错是什么玩意,比如这个: signature, err := rsa.SignPKCS1v15(rand.Reader, this.privateKey, crypto.SHA1, hashed) //ParsePKCS8PrivateKey err asn1: structure error: tags don't match (16 vs {class:0 tag:2 length:129 isCompound:f...阅读全文

博文 2016-11-29 01:00:02 u012210379

golang: Martini之inject源码分析

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

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

golang socket编程

osi参考模型将计算机网络结构分为7个层次,但是在实际的开发应用中,我们更加认可TCP/IP族协议的五层结构,即应用层(http、ftp、dns),传输层(udp、tcp),网络层(ip),链路层(以太网),物理层。 socket编程作为一种基于网络层和传输层的数据io模式主要分为两种,TCP Socket和UDP Socket,也即面向连接的流式Socket和面向无连接的数据报式Socket。 今天主要和大家讲讲golang的TCP Socket编程。先来看个简单的例子吧 server.go //模拟server端 func main() { tcpServer, _ := net.ResolveTCPAddr("tcp4", ":8080") listener, _ := net.Lis...阅读全文

博文 2017-11-30 15:03:06 ssdut_buster

深入Go UDP编程

目录 [−] 一个简单的例子更复杂的例子等价的客户端和服务器Read和Write方法集的比较通用多播编程标准库多播编程广播任播参考文档 用户数据报协议(User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报(package-oriented)的传输层协议,正式规范为RFC 768。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验。 由于缺乏可靠性且属于非连接导向协议,UDP应用一般必须允许一定量的丢包、出错和复制粘贴。但有些应用,比如TFTP,如果需要则必须在应用层增加根本的可靠机制。但是绝大多数UDP应...阅读全文

博文 2017-02-08 12:53:43 smallnest

理解 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

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的优点和缺...阅读全文

go 发送post请求

package core import ( "net/http" "net/url" "strings" "encoding/json" "io/ioutil" "fmt" ) /* *发送GET请求 * */ func UrlGet()(result map[string]interface{}){ return nil } /* *发送post请求 *@param apiUrl api地址 *@param postParam post参数 *@param result map格式json数据, err error对象 */ func UrlPost(apiUrl string,postParam map[string]string)(result map[string]interface...阅读全文

博文 2015-10-21 09:00:01 煅魂大师

Golang协程与通道整理

协程goroutine 不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换。Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之,不通过OS进行切换,自行切换,系统运行开支大大降低 通道channel 并发编程的关键在于执行体之间的通信,go通过通过channel进行通信 channel可以认为类似其他OS体系中的消息队列,只不过在go中原生支持,因而易用 消息队列有哪些值得关注的地方?常见问题包括创建、关闭或删除、阻塞、超时、优先级等,golang中也不例外。罗列如下: 可否探测队列是满或空?或者说是否可以不阻塞地尝试读写? 读阻塞和写阻塞时关闭会怎样? 关闭后未读取的消息会被抛弃? 往关闭的channel发送数据或读取数据会怎样? 怎样探测channel的...阅读全文

Go语言 Channel <- 箭头操作符 详解

Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。它的操作符是箭头 <- 。[plain] view plain copy print?ch <- v // 发送值v到Channel ch中 v := <-ch // 从Channel ch中接收数据,并将数据赋值给v ch <- v // 发送值v到Channel ch中 v := <-ch // 从Channel ch中接收数据,并将数据赋值给v (箭头的指向就是数据的流向)就像 map 和 slice 数据类型一样, channel必须先创建再使用:[plain] view plain copy print?ch := make(chan int...阅读全文

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以及其他编译器着的一样,以启用代码生成的很多优化。这些优化包含更好的无用代码的消除,寄...阅读全文

Go http.StripPrefix在File Server中的用途

一. 保持代码的整洁和进行合理的分流 http.StripPrefix函数的作用之一,就是在将请求定向到你通过参数指定的请求处理处之前,将特定的prefix从URL中过滤出去。下面是一个浏览器或HTTP客户端请求资源的例子: /static/example.txt StripPrefix 函数将会过滤掉/static/,并将修改过的请求定向到http.FileServer所返回的Handler中去,因此请求的资源将会是: /example.txt http.FileServer 返回的Handler将会进行查找,并将与文件夹或文件系统有关的内容以参数的形式返回给你(在这里你将"static"作为静态文件的根目录)。因为你的"example.txt"文件在静态目录中,你必须定义一个相对路径去获...阅读全文

博文 2016-12-23 10:00:01 吃一堑消化不良

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

golang udp服务端客户端例子

golang udp服务端客户端例子 服务端: package main import ( "fmt" "net" ) func main() { // 创建监听 socket, err := net.ListenUDP("udp4", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 8080, }) if err != nil { fmt.Println("监听失败!", err) return } defer socket.Close() for { // 读取数据 data := make([]byte, 4096) read, remoteAddr, err := socket.ReadFromUDP(data) if err != nil...阅读全文

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

Go 语言 SMTP指令发邮件(实例)

简单邮件传输协议(SMTP)是一种基于文本的电子邮件传输协议,是在因特网中用于在邮件服务器之间交换邮件的协议。SMTP是应用层的服务,可以适应于各种网络系统。SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF(\r\n)。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。 SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体为: (1)建立TCP连接。 (2)客户端向服务器发送HELLO命令以标识发件人自己的身份,然后客户端发送MAIL命令。(EHLO 是扩展指令,不同服务器有不同指令) (3)服务器端以OK作为响应,表示准备接收。 (4)客户端发送RCPT命令。 (5)服务器端表示是否愿意为收件人接收邮件。 (6)协商结束,发送邮件,用命令DA...阅读全文

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