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

[转载]MMO网络游戏服务器中mysql数据库访问的性能优化探讨

问题: 和一些做mmo大型网络游戏服务器端的人讨论了一些mysql数据库访问的问题,因为我本人没有实际开发大型网游的经验,所以他们说的我也理解的不深,我还是努力理解,但还是觉得他们所谈的好象并不是那么一回事; mysql数据库的访问一般就通过他提供的c api接口访问就可以了,网络游戏服务器端事先和mysql建立并保持1个或者几个连接,正常情况下这些连接将一直保持; 为提高性能,网络游戏服务器程序启动后一般都会把事先需要的数据从数据库提取到内存供使用,以减少读数据库的频率,这到好理解; 当然,网游开发中,遇到需要立即写库或者更新库的内容时,我们会立即向数据库服务器发送insert,delete,update等以期望数据库能立即更新我们的数据,比如玩家切换到新地图,这种数据就有必要立即提交到数...阅读全文

博文 2019-01-01 12:34:45 Golang语言社区

Learn Golang in Days - Day 14

Learn Golang in Days - Day 14 简介 Go语言提供了另外一种数据类型就是接口,它把所有具有共性的方法定义在一起,只要实现了这些方法就是实现了这个接口。 package main import "fmt" /* 声明接口 */ type Phone interface { call() } /* 定义结构体 */ type NokiaPhone struct { } /* 实现接口方法 */ func (nokiaPhone NokiaPhone) call() { fmt.Printf("I am nokia phone.\n") } /* 定义结构体 */ type IPhone struct { } /* 实现接口方法 */ func (iPhone IPho...阅读全文

博文 2019-02-07 15:34:43 笑吧小鸟

聊聊golang的context

golang的context的主要用途在于在多个goroutine之间传递数据,管理多个goroutine的生命周期。实际的应用场景有比如,在http服务中,每个请求就对应一个goroutine,而请求之中可能又会调用别的api,而产生更多的goroutine,用context来管理这些goroutine就能比较方便在这些goroutine中传递数据和管理。 主要方法 func Background() Context Background() 返回一个空的context,这是一个根节点。 func TODO() Context TODO()返回的也是一个空的context,它跟Background的区别在于目的,当你使用一个todo的context时,代码维护者便知道当时的设计意图是待定的...阅读全文

博文 2020-03-21 13:32:46 onepunchgo

数组与切片

# 数组 ### 定义:是同一种数据类型的**固定长度**的序列。var a [len]int #### 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型,数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic #### 数组是值类型,因此改变副本的值,不会改变本身的值 example:fibonacci非递归: ``` func fibonacci() { fib := [20]int64{0: 1, 1: 1} for i := range fib { if i == 0 || i == 1 { continue } fib[i] = fib[i-1] + f...阅读全文

博文 2018-10-12 16:12:36 ace_kylin

LollipopGo开源游戏服务器框架--子游戏服务器源码

大家好,我是彬哥,本节给大家讲下LollipopGov1.0.20190102版本游戏服务器子游戏服务器,抛砖引玉了,主要是针对Go语言游戏服务器子游戏斗兽棋服务器处理。 package main import ( "LollipopGo/LollipopGo/log" "Proto" "Proto/Proto2" "cache2go" "flag" "fmt" "net/rpc" "net/rpc/jsonrpc" "strings" "time" "LollipopGo/LollipopGo/util" _ "LollipopGo/ReadCSV" _ "LollipopGo/LollipopGo/player" "code.google.com/p/go.net/websocket" ...阅读全文

博文 2019-01-12 01:36:39 Golang语言社区

Let US sort

## 在这篇文章里,我尝试发掘 [Go](https://golang.org/) 语言的所有特性,以便用最优的、利用多核处理器的方式来实现 [归并排序](https://en.wikipedia.org/wiki/Merge_sort)。 时间复杂度为 `O(nlogn)` 的最优排序算法中,归并排序是其中之一。它的原理为将数组分为两部分,分别进行排序,最后再归并,这种做法的开销没那么大。 ![红色表示分割和排序,绿色表示归并](https://raw.githubusercontent.com/studygolang/gctt-images/master/let-us-sort/1_I9QJGWEgHtoo9H_hgVOg4g.png) *颜色说明:红色表示分割和排序,绿色表示归并* 让...阅读全文

【他山之石】大话密码学·默克尔树·章三 扬前帆

前帆(Jib):主桅杆前面使用的帆 基本定义 Merkle Tree 是由计算机科学家 Ralph Merkle 在很多年前提出的,并以他本人的名字来命名,中文翻译过来叫默克尔树,也叫哈希树。 哈希树 主要用途 Merkle Tree 常用来做完整性校验的,所谓的完整性校验,就是检查一下数据有没有损坏或者被恶意篡改。 Merkle Tree 的最大的应用场合就是在点对点网络上,早期的 BT ,电驴,快播等各种下载器,以及目前普遍使用的 Git 版本控制系统,NMP包管理,GoLang 包管理,IPFS 协议以及比特币以太坊等等项目都用到了它。例子太多了……欢迎补充…… Merkle Tree Merkle Tree 如果直接去看定义,会看到一张比较复杂的图,可能会把你一下子吓到,然后就不想学...阅读全文

时序数据库 InfluxDB(三)

相关文章:时序数据库 InfluxDB(一)时序数据库 InfluxDB(二)时序数据库 InfluxDB(三)时序数据库 InfluxDB(四)时序数据库 InfluxDB(五) 数据类型 InfluxDB 是一个无结构模式,这也就是说你无需事先定义好表以及表的数据结构。 InfluxDB 支持的数据类型非常简单: measurement : string tag key : string tag value : string field key : string field value : string , float , interger , boolean 你可以看到除了 field value 支持的数据类型多一点之外,其余全是字符串类型。 当然还有最重要的 timestamp ,...阅读全文

Go channel类型

Channel是Go中的一个核心类型,可以把它看成一个管道,Goroutine通过它可以发送或者接收数据并进行通讯。它的操作符号是 <- ,就像map和slice一样,channel必须先创建才能够使用: ch=make(chan int) // int表示chan里面的数据类型 ch :=make(chan interface{}) //任意数据类型的chan Channel类型 Channel类型的定义格式如下: ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType . 包括三种类型的定义。 <- 表示数据的流向,如果没有指定 <-,则表示chan既可以发送数据也可以接受数据。 Channel声明 chan in...阅读全文

Go Chanel 使用与原理 三

上篇已经记录到发送数据到 chanel 的三种情况的代码逻辑,接下来是从 chanel 接收数据的逻辑。 chanrecv 方法 和 chansend 方法十分类似 如果 hchan 为空 if c == nil { if !block { return } gopark(nil, nil, waitReasonChanReceiveNilChan, traceEvGoStop, 2) throw("unreachable") } 如果 chenel 已经关闭 lock(&c.lock) if c.closed != 0 && c.qcount == 0 { if raceenabled { raceacquire(c.raceaddr()) } unlock(&c.lock) if ep ...阅读全文

博文 2019-03-17 00:34:41 chencanxin

十年磨一剑,阿里巴巴企业级数据管理平台:iDB

摘要: 阿里巴巴企业级数据库管理平台iDB面向云时代推出数据管理DMS企业版,是业界首创的数据库DevOps解决方案,形成了云时代企业数据管理的最佳实践。 十年间,阿里巴巴的研发人员也增长了十倍,为了解决DBA的服务效率问题,十年前我们开始iDB的研发,完成手工变更的在线化,成为了DBA能力产品化的载体。在最新的4.0版本中,iDB面向云时代推出数据管理DMS企业版,是业界首创的数据库DevOps解决方案,形成了云时代企业数据管理的最佳实践。 一、 为了效率与安全而生 在阿里巴巴,数据库团队是数据的守护者,保障着数据库安全、稳定、高效的运行。在早期,DBA除了负责数据库的基础运维,对于研发流程中的数据库变更也都由DBA负责,包括线上库表设计、结构变更发布、数据变更、SQL审...阅读全文

GO中 TCP 的receivebuffSize sendBufSize 第一次偶尔失效

```go tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") fmt.Println(err) server, e := net.ListenTCP("tcp", tcpAddr) fmt.Println(e) for { conn, _ := server.AcceptTCP() util.SetTCPOption(conn) } ``` ```go tcpConn := conn.(*net.TCPConn) tcpConn.SetNoDelay(false) tcpConn.SetWriteBuffer(30000) tcpConn.SetRe...阅读全文

go反射实践及剖析

Go struct拷贝在用Go做orm相关操作的时候,经常会有struct之间的拷贝。比如下面两个struct之间要拷贝共同成员B,C。这个在struct不是很大的时候从来都不是问题,直接成员拷贝即可。但是当struct的大小达到三四十个成员的时候,就要另辟蹊径了。12345678910111213type A struct { A int B int C string E string}type B struct { B int C string D int E string} 做法一. 反射123456789101112131415func CopyStruct(src, dst interface{}) { sval := reflect.ValueOf(src).Elem() dva...阅读全文

go"泛型编程"

开始文章之前我们要先弄清楚什么是『泛型编程』。 In the simplest definition, generic programming is a style of computer programming in which algorithm are written in terms of types to-be-specified-later that are then instantiated when needed for specific types provided as parameters. – From Wikipedia. 简单来说就说,我们编写的代码不是针对特定的类型(比如适用于int, 不适用于string)才有效,而是大部分类型的参数都是可以工作的。我们来看一...阅读全文

GO学习笔记(一)

变量 变量声明 通过关键字var声明变量,数据类型在变量名后。 var a int var b int = 10 变量声明语句可以不需要使用分号作为结束符。 可以将若干个需要声明的变量放置在一起,避免重复写var关键字。 var ( a int b string ) 初始化变量 初始化变量时可以不用声明数据类型,go编译器会根据表达式右值推导出该声明为哪种类型。 var a int = 10 var a = 10 可以使用 := 操作符,用于明确表达同时进行变量声明和初始化工作,可以减少写关键字var跟数据类型。 变量赋值 go支持多重赋值 var i var j i, j = j, i 这样就可以减少引入一个中间变量。 var t = i; var i = j; var j = t; 匿名...阅读全文

[译] CockroachDB GC优化总结

几周前我们分享了一个帖子讲述我们为什么选择Go语言编写CockroachDB,我们收到一些问题,询问我们是如何解决Go语言的一些已知问题,特别是关于性能、GC和死锁的问题。 本文中我们将分享几个非常有用的优化技巧用以改善许多常见的GC性能问题(接下来还将覆盖一些有趣的死锁问题)。我们将重点分享如何通过嵌套结构体、使用 sync.Pool、和复用后端数组减少内存分配和降低GC开销。 减少内存分配和GC优化 将Go与其他语言(比如java)区别开来的是Go语言能让你管理内存布局。通过GO语言,你可以合并碎片,而其他垃圾集合语言不能。 让我们看看CockroachDB中从磁盘读取数据并解码的一小段代码: metaKey := mvccEncodeMetaKey(key) var meta MVCC...阅读全文

博文 2017-02-09 08:09:20 Coldstar

golang数据类型rune的使用

我们知道golang的数据类型有布尔型,字符串型,数字类型,派生类型。rune它属于数字类型,类似in32。 官方解释: // rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by convention, to distinguish character values from integer values. type rune = int32 翻译成中文:rune是int32的别名,在所有方面都等同于int32。它是按惯例,用于区分字符值和整数值。 看了官解我还没有了解其真正含义,rune一般用在哪?现在我通过2个例子来讲一下rune的使用。 举例说明 例子1:字符串截取 如...阅读全文

博文 2020-01-21 17:32:43 小手25

MaxComputeSql性能调优

摘要: 转载自xiaorui 部分用户(尤其对外输出)使用MaxCompute(原Odps)时,由于对产品的使用层面和执行层面了解程度不同,导致提交的任务执行时间过长、占用了较多集群资源;严重的会导致失败、不仅需要投入支持同学精力协助解决、也影响了用户正常业务。 合并整理部分性能提升方法方 转载自xiaorui 部分用户(尤其对外输出)使用MaxCompute(原Odps)时,由于对产品的使用层面和执行层面了解程度不同,导致提交的任务执行时间过长、占用了较多集群资源;严重的会导致失败、不仅需要投入支持同学精力协助解决、也影响了用户正常业务。 合并整理部分性能提升方法方便支持用户查询和优化Sql,提高效率;部分需要原来手动调优的如mapjoin、ppd...阅读全文

从一道面试题看golang slice

之前遇到一道感觉很不错的slice面试题,这里分享出来,先不贴答案了大家可以先思考下每个地方的打印会是什么;最后再给大家公布答案 v := make([]int, 0, 5) v = append(v, 2, 3, 5) a := append(v, 0, -1) fmt.Println(v) fmt.Println(a) b := append(v, 1) fmt.Println() fmt.Println(v) fmt.Println(a) fmt.Println(b) c := append(v, 6, 7, 8, 9) fmt.Println() fmt.Println(v) fmt.Println(a) fmt.Println(b) fmt.Println(c) d := appe...阅读全文

golang中使用一个通道向多个goroutine发送一个数据

向一个goroutine通信 向通道发送一次消息只有一个goroutine能收到数据,goroutine向一个通道取数据类似于银行里一个柜台排队取钱,goroutine是那排在长长的队伍,一个通道(channel)就是一个柜台,只有等前一个goroutine取完数据之后,后一个goroutine才能取下一个数据。 一个goroutine循环接收 golang中向一个goroutine只需将值传入通道中,然后在goroutine里从这个通道取值即可,由于只有一个goroutine在循环接收数据,相当于队伍中只有一个人,取完数据之后可以继续站在柜台前等待,例如: package main import ( "bufio" "os" ) func main() { ch, scan:= make(...阅读全文

数据结构和算法(Golang实现)(27)查找算法-二叉查找树

二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树。 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点。 左右子树也是一颗二叉查找树。 二叉查找树的特点是,一直往左儿子往下找左儿子,可以找到最小的元素,一直往右儿子找右儿子,可以找到最大的元素。 看起来,我们可以用它来实现元素排序,可是我们却使用了二叉堆来实现了堆排序,因为二叉查找树不保证是一个平衡的二叉树,最坏情况下二叉查找树会退化成一个链表,也就是所有节点都没有左子树或者没有右子树,树的层次太深导致排序性能太差。 使用二分查找,可以很快在一颗二叉查找树中找到我们需要的值。 我们来分析二叉查找树添加,删除,查找元素的方法。 一、添加元素 以下是一个二叉查...阅读全文

博文 2020-04-07 16:32:51 陈星星

Golang教程:goroutine信道

在上一篇教程中,我们讨论了如何使用协程实现并发。在这篇教程中,我们将讨论信道以及如何使用信道实现协程间通信。 什么是信道 信道(Channel)可以被认为是协程之间通信的管道。与水流从管道的一端流向另一端一样,数据可以从信道的一端发送并在另一端接收。 声明信道 每个信道都有一个与之关联的类型。此类型是允许信道传输的数据类型,除此类型外不能通过信道传输其他类型。 chan T 是一个 T 类型的信道。 信道的 0 值为 nil。值为 nil 的信道变量没有任何用处,我们需要通过内置函数 make 来创建一个信道,就像创建map和 slice一样。 下面的代码声明了一个信道: 1 package main 2 3 import "fmt" 4 5 func main() { 6 var a ch...阅读全文

博文 2018-06-07 15:30:01 liuzhongchao

go数据类型

命名规范允许:字母,数字,下划线不能已数字开头名字不能是关键字区分大小写变量声明变量:var 变量名 变量类型多个变量声明:var 变量名1,变量名2 数据类型1,数据类型2声明变量必须要使用变量默认值为0同一个函数中,变量名必须是唯一的自动推导类型":=" 自动推导类型作用是声明变量,同时给变量赋值,通过变量值声明变量类型多个变量声明 var ( a = 1 b = 2.1 )Printf和Println的区别Printf 格式化输出 【fmt.Printf("a = %d\n", a):将变量a的值输出到%d的位置,\n:换行】Println 一段一段输出,并自动换行常量声明常量: const 常量名 常量类型常量不允许修改自动推导:const 常量名称 = 常量值多个常量声明 var ...阅读全文

微服务架构下 Service Mesh 会是闪亮的明天吗?

7月7日,时速云企业级容器 PaaS 技术沙龙第 10 期在上海成功举办,时速云容器架构负责人魏巍为大家详细讲解了 Service Mesh 中代表性的实践方案、并以 Istio 为例详细讲解了 Service Mesh 中的技术关键点,包括 Istio 控制平面、Istio 数据平面等。以下内容根据魏巍分享整编,希望对大家了解 Service Mesh 有所帮助。 魏巍:大家下午好,刚才几位讲师讲了 K8S 的存储、PaaS 在企业的落地实践等,我们接下来要讲的是企业有了 PaaS 平台、并且在平台上部署了各种各样的服务之后,这些服务该如何治理、服务与服务之间的关系,以及该以何种方式去维护等问题,而最近两年兴起的 Service Mesh,能够更加便捷的管理这些服务。 Service Me...阅读全文

从零学习 Go 语言(05):数据类型之数组与切片

Hi,大家好呀,我是一个刚学习 Go 语言不久的新手,在入门 Golang 的这段时间里,我写了很多详细的学习笔记,很适合新手学习噢。这些文章已经发布在我的个人微信公众号里:《Go编程时光》里,今天开始将文章内容搬运到这里,希望有更多的人看到,给更的人带来帮助,但是这里文章会相对滞后,想获取最新文章,可以前往关注《Go编程时光》,请放心关注,这是一个纯分享的号,完全没有广告。 **系列导读 ** [从零学习 Go 语言(01):一文搞定开发环境的搭建](https://studygolang.com/articles/27365) [从零学习 Go 语言(02):学习五种变量创建的方法](https://studygolang.com/articles/27432) [从零学习 Go 语言(...阅读全文

博文 2020-03-27 12:21:25 hello_wbm

用Go语言实现ReactiveX(一)——Observable

用Go语言实现ReactiveX有很大的挑战,Go语言本身没有类的继承,所以无法采用基类来做一些封装操作。不过好在Go语言是有闭包和匿名函数。所以可以实现ReactiveX https://github.com/langhuihui/GoRx 影响设计ReactiveX的要素 没有类的继承 有匿名函数 有闭包 强类型,没有泛型 goroutine代替异步 实现生产者Observable 发送数据 完成事件 error事件 被订阅 被取消订阅 发送数据功能 有两种方式可以实现,一种是直接调用回调函数,和javascript一样。这种方式的局限性在于代码相对啰嗦,因为golang的函数定义必须是有类型的,会涉及到更多的类型断言的操作,匿名函数使用起来也比javascript的要更麻烦一些。第二种...阅读全文

博文 2018-09-27 10:34:48 一个灰

[翻译]GO并发模型:Pipeline和Cancellation

image.png 原文地址:https://blog.golang.org/pipelines 介绍 Go并发模型可以非常容易地构建出能高效利用IO和多CPU的数据pipeline。这篇文章将以此为重点来介绍,同时也会涉及到一些在实践中易犯的错误及其对应的解决之法。 什么是Pipeline 在GO中,pipeline无明确定义;它是语言提供的一种并发编程方式,由连接各个chanel而形成的一系列阶段组成。在其各个阶段,可能分别运行着很多由同一函数产生的goroutine。这些goroutine 从输入channel接收数据 对数据作相应处理,例如在此基础上产生新数据 再通过输出channel把数据发送出去 除了开始和结束,每个阶段都会包含任意多个输入和输出channel。开始阶段只有输出c...阅读全文

队列

如何理解队列 队列与栈做比较,就是队列是先进先出,队列本身就像一个管子一样。 队列 先进先出就是一个典型的队列。队列的应用十分广泛,特别是具有额外特性的队列,比如循环队列,阻塞队列,并发队列等,这些都是偏底层系统,框架,中间件的开发,都是有队列的身影,比如高性能的队列Disruptor、Linux环形缓存等。Java concurrent 并发包利用ArrayBlockingQueue 来实现公平锁等 如何实现一个队列 队列最基本的操作是 入队enqueue(),放一个数据到对尾;出队dequeue(),从队头取出一个元素。用数组实现的队列就是顺序队列,用链表实现的队列就是链式队列。 顺序队列 一个最基础的顺序队列实现(使用golang) type Queue struct { Items ...阅读全文

博文 2019-08-25 17:32:55 OOM_Killer

nutsdb 单机 1 亿、10 亿数据实测分享

大家好, 想给大家分享下我最近为 nutsdb 做的数据测试。测试项目github 地址: github.com/xujiajun/nu…起因事情起因是这个 issue ,简单说就是内存高了,不够用了。可能很多人不知道 NutsDB。简单介绍下,NutsDB 是我几个月以前开源的一个 Go 语言编写的内嵌型 KV 数据库,支持多种数据结构。开源取的的反馈:一开源就上了 Go 趋势榜。一周斩获 500+star,也得到很多同行的关注,给我提建议。还有几个用在了生产环境。验证测试一亿条数据回到正题: 为了验证这个 issue 于是我先测了一个亿的数据量版本:nutsdb V0.4.0 服务器配置:Ubuntu 16.04 64 位 8 核 64G 数据量:占有 11G 左右 (目前版本没有做压缩...阅读全文

博文 2019-07-25 15:12:07 xujiajun001

Go实现数据结构--线性表之顺序表

使用golang语言的interface接口类型创建顺序表 package main import "fmt" // 数据结构之线性表--顺序表 type List struct { Len int //线性表长度 Capacity int // 表容量 Prt *[]interface{} // 指向线性表空间指针 } // 初始化 func (l *List) ListInit(capacity int) { l.Capacity = capacity l.Len = 0 m := make([]interface{}, capacity) l.Prt = &m } // 判空 func (l *List) ListIsEmpty() bool { if l.Len == 0 { ret...阅读全文

博文 2020-04-09 21:32:42 阿鸠先生

你的数据安全么?Hadoop再曝安全漏洞| 黑客利用Hadoop Yarn资源管理系统未授权访问漏洞进行攻击

摘要: 4月30日,阿里云发现,俄罗斯黑客利用Hadoop Yarn资源管理系统REST API未授权访问漏洞进行攻击。 Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce 算法进行分布式处理,Yarn是Hadoop集群的资源管理系统。 此次事件主要因Hadoop YARN 资源管理系统配置不当,导致可以未经授权进行访问,从而被攻击者恶意利用。攻击者无需认证即可通过REST API部署任务来执行任意指令,最终完全控制服务器。 利用方式还原及趋势判断 1、通过对比分析,阿里云安全专家观察到,与之前Redis、CouchDB事件相比,Hadoop作为一个分布式计算应用程序框架,让其更容易被“攻陷”,因为: Hadoop种类...阅读全文

Go语言中的常量

1 概述 常量,一经定义不可更改的量。功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率。从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改。例如当前处理器的架构类型,可以保证不被更改。 语法如下 2 定义单个常量 const 常量名 <可选的类型> = 常量值 const c1 int = 1000 Go语言中,标识符(常量名)是否大小写,取决于是否需要在导出时被识别。 常量的值仅仅支持,基础类型,字符串,字符,整型,浮点,布尔。 3 类型推导 类型可以通过值推导出来,大多数情况可以省略类型,例如 const c2 = 1000 除非你想使用例如,int8, byte,float32这些非默认类型时,需要指定类型,例如 const c3 int16 =...阅读全文

博文 2018-10-28 07:35:08 小韩说课

go基础系列:结构struct

Go语言不是一门面向对象的语言,没有对象和继承,也没有面向对象的多态、重写相关特性。 Go所拥有的是数据结构,它可以关联方法。Go也支持简单但高效的组合(Composition),请搜索面向对象和组合。 虽然Go不支持面向对象,但Go通过定义数据结构的方式,也能实现与Class相似的功能。 一个简单的例子,定义一个Animal数据结构: type Animal struct { name string speak string } 这就像是定义了一个class,有自己的属性。 在稍后,将会介绍如何向这个数据结构中添加方法,就像为类定义方法一样。不过现在,先简单介绍下数据结构。 数据结构的定义和初始化 除了int、string等内置的数据类型,我们可以定义structure来自定义数据类型。 ...阅读全文

博文 2018-11-23 09:08:26 f-ck-need-u

Go的并发没有它,就像iphone没有网络一样

Go的并发没有它,就像iphone没有网络一样 简介 Golang的并发属性是该语言的一个大杀器,说到并发就不能不提Channel,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯。这篇文章来深入了解一下 channel。 channel 的设计是基于 CSP 模型的。CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel。CSP 模型的关键是关注 channel,而不关注发送消息的实体。Go 语言实现...阅读全文

博文 2018-07-02 17:34:46 freelang

并发编程示例

使用golang的timer 定时任务 func demo(input chan interface{}) { t1 := time.NewTimer(time.Second * 5) t2 := time.NewTimer(time.Second * 10) for { select { case msg <- input: println(msg) case <-t1.C: println("5s timer") t1.Reset(time.Second * 5) case <-t2.C: println("10s timer") t2.Reset(time.Second * 10) } } } 断续器 func main(){ ticker := time.NewTicker(time...阅读全文

golang(cgo)---如何在两个不同的package中使用同样的自定义数据类型?

如何在两个不同的package中使用同样的自定义数据类型?这里主要针对包括在C头文件中结构体类型,如果只是在不同的go package中自定义数据类型,这个很好处理。但实际上处理的核心是一样的,下面通过两个例子来说明解决办法。 测试例程目录 ├── include │ └── data.h └── src ├── common │ └── common.go └── main └── main.go 测试 data.h #pragma once #include struct Data { int a; char b; }; common.go package common /* #include #cgo CFLAGS : -I../../inclu...阅读全文

博文 2016-09-01 21:00:03 FreeApe

分布式强一致kv缓存(1)

本人从事游戏行业,因此这个缓存系统主要针对网络游戏的数据访问模式设计。 首先分析下网络游戏的数据访问模式: 1)关系性弱:对于绝对大多数的游戏类型来说,能通过一个key来访问数据就够了。 2)读多写多:用户登录时通常需要加载大量数据,查询其它玩家信息也是一个频繁的操作请求。在不考虑定时回写的情况下,玩家的每个更新类请求都会产生一次数据库回写请求,对于一个在线10W,养成类游戏,每秒写请求达到10W+是可能的。 3)冷数据多:游戏的注册用户数和活跃用户数差距非常大。大量数据平时几乎不被访问,只有偶尔做活动用户回流时才被访问。 4)响应及时性:即使是一个查看其它用户信息的查询请求,响应时间超过200ms也是非常不友好的。 基于以上考量,我设计了一套名为flyfish的冷热缓存系统,系统设计目标如...阅读全文

博文 2019-10-15 10:02:47 sniperHW

Rust错误处理

Rust错误处理 本文同步于Rust中文社区专栏文章:Rust错误处理 ,本文时间:2018-12-14, 译者:krircc,简介:天青色,原文出处 欢迎向Rust中文社区投稿,投稿地址 ,好文将在以下地方直接展示 Rust中文社区首页 Rust中文社区文章栏目 知乎专栏Rust中文社区 思否专栏Rust中文社区 简书专题Rust中文社区 微博Rustlang-cn 智能编译器 Rust编译器最重要的工作是防止Rust程序中的错误。如果代码没有正确遵循内存管理规则或生命周期注释,它会在编译时分析代码并发出警告。例如, #[allow(unused_variables)] //???? A lint attribute used to suppress the warning; unused...阅读全文

博文 2018-12-14 12:34:41 krircc

数据结构和算法(Golang实现)(22)排序算法-希尔排序

希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机学会月刊发布了一个排序算法,从此名为希尔排序的算法诞生了。 注:ACM = Association for Computing Machinery,国际计算机学会,世界性的计算机从业员专业组织,创立于1947年,是世界上第一个科学性及教育性计算机学会。 希尔排序是直接插入排序的改进版本。因为直接插入排序对那些几乎已经排好序的数列来说,排序效率极高,达到了O(n)的线性复杂度,但是每次只能将数据移动一位。希尔排序创造性的可以将数据移动n位,然后将n一直缩小,缩到与直接插入排序一样为1,请看下列分析...阅读全文

基于 MySQL Binlog 实现可配置的异构数据同步

随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经 不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们在业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 Part.1 现有方案及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的方式,读取 MySQL 中间表中 UTime 大于上一次读取时间的所有数据,即该段时间内的增量,写入Elasticsearch。 所以,一旦业务逻辑中有相...阅读全文

博文 2020-04-17 07:32:49 Minna_1122

Go 译文之如何构建并发 Pipeline

作者:Sameer Ajmani | 原文:blog.golang.org/pipelines 译者前言 这篇文章来自 Go 官网,不愧是官方的博客,写的非常详细。在开始翻译这篇文章前,先简单说明两点。 首先,这篇文章我之前已经翻译过一遍,但最近再读,发现之前的翻译真是有点烂。于是,决定在完全不参考之前译文的情况下,把这篇文章重新翻译一遍。 其二,文章中有一些专有名字,计划还是用英文来表达,以保证原汁原味,比如 pipeline(管道)、stage (阶段)、goroutine (协程)、channel (通道)。 关于它们之间的关系,按自己的理解简单画了张草图,希望能帮助更好地理解它们之间的关系。如下: 强调一点,如果大家在阅读这篇文章时,感到了迷糊,建议可以回头再看一下这张图。 翻译的正...阅读全文

博文 2019-06-12 23:34:18 波罗学

Hive 数据类型 + Hive SQL

基本类型 整型 int tinyint (byte) smallint(short) bigint(long) 浮点型 float double 布尔 boolean 字符 string char(定长) varchar(变长) 时间类型 timestamp date 引用/复合类型 优点类似于容器(Container),便于我们操作数据 复合类型可以和复合类型相互嵌套 Array 存放相同类型的数据 数据按照索引进行查找,索引默认从0开始 user[0] Map 一组键值对,通过key可以访问到value key不能相同,相同的key会相互覆盖 map['first'] Struct(就是C语言中的结构体, golang中也有) 定义对象的属性,结构体的属性都是固定的 通过属性获取值 us...阅读全文

博文 2019-10-31 12:32:46 aside section._1OhGeD

Go语言Telnet回音服务器

package main import ( "fmt" "net" "bufio" "strings" "os" ) func main() { // 创建一个程序结束码的通道 exitChan := make(chan int) // 将服务器并发运行 go server("127.0.0.1:7001", exitChan) // 通道阻塞, 等待接收返回值 code := <-exitChan // 标记程序返回值并退出 os.Exit(code) } // 服务逻辑, 传入地址和退出的通道 func server(address string, exitChan chan int) { // 根据给定地址进行侦听 l, err := net.Listen("tcp", address...阅读全文

博文 2020-01-16 12:33:12 huang_he_87

《Go语言四十二章经》第二十二章 通道(channel)

《Go语言四十二章经》第二十二章 通道(channel) 作者:李骁 ## 22.1 通道(channel) Go 奉行通过通信来共享内存,而不是共享内存来通信。所以,**channel 是goroutine之间互相通信的通道**,goroutine之间可以通过它发消息和接收消息。 channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。 channel是类型相关的,一个channel只能传递(发送或接受 | send or receive)一种类型的值,这个类型需要在声明channel时指定。 默认的,信道的存消息和取消息都是阻塞的 (叫做无缓冲的信道) 使用make来建立一个通道: ```go var channel...阅读全文

初步解读Golang中的接口相关编写方法

初步解读Golang中的接口相关编写方法概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键。在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心。Go语言中的接口是一些方法的集合(method set),它指定了对象的行为:如果它(任何数据类型)可以做这些事情,那么它就可以在这里使用。接口的定义和使用比如复制代码代码如下:type I interface{ Get() int Put(int) }这段话就定义了一个接口,它包含两个函数Get和Put好了,我的一个接口实现了这个接口:复制代码代码如下:type S struct {val int}func (this *S) Get int { ret...阅读全文

博文 2017-02-09 17:30:58 umigo0819

Slice使用详解

在Golang语言中,数据类型不多,但是够用,开发项目过程中,Slice属于最常用的数据结构之一,对其原理理解不清楚,很容易会遗留bug,笔者查询了很多博客资料,对Slice的原理进行一个总结,如果有写的不清楚不明白之处,请多多包涵,并予以指正。 package main import "fmt" func main(){ s := []int{5} s = append(s,7) fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0]) s = append(s,9) fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0]) x := append(s, 11) fmt.Println("cap(s) ...阅读全文

博文 2017-07-11 08:08:54 呵呵哈哈哈high

Mins: 一个mini版的restful api资源服务器

介绍 又双叒叕造了一个轮子。Mins,mini server。一个小型服务器。主要用来做一些小型项目开发,或者前端调试用的服务器。内置完成了增删改查的api。只要配置好数据表,就可以对数据表的资源进行增删改查,用约定好的api路由。用来补充略显鸡肋而常用的"nodejs启动服务器"或"php -S"操作。 项目地址 https://github.com/chenhg5/mins 使用 十分的简单,利用提供的二进制文件,传入参数 -c 即可。 mins -c /the/config/file/path 路由 方法 路径 GET /resource/:table/id/:id DELETE /resource/:table/id/:id PUT /resource/:table/id/:id P...阅读全文

博文 2018-07-09 14:34:47 honhon