201806-30 云计算后,Go 的下一个战场:游戏产业 NEW Go 自诞生以来,因其简单高效的处理效率和对于并发的出色支持,得到开发人员的关注和实践。并在 2013 年随着重磅项目 Docker 的诞生和发展,逐步在云计算领域形成燎原之势。在占领了云计算后,Go 的下一个发力点将会在何方? 在 ECUG Con 十周年盛会上,七牛云 CEO、Go 首席布道师许式伟给出了他心中的答案:游戏行业。 以下是对他此次演讲的内容记录 作为一个技术型 CEO,我认为技术人员都是很纯粹的,以数据为导向,理性判断趋势,所以今天我会站在理性角度分析,... Read More >
201806-29 go anonymous function NEW package main import "fmt" // function addfunc add(a, b int) int {return a + b} // 1func testFunc1() { // function "add" to var "f1" // then "f1" is a function f1 := add // type of f1 = func(int int) int fmt.Printf("type of f1 = %Tn", f1)... Read More >
201806-28 Golang 切片 NEW 一个切片(slice) 是一个数组某个部分的引用。 1、切片初始化 (1)、通过内置函数make初始化:slice := make([]Type,len,[cap]) []Type,某种类型的数组;Len 表示切片数据长度;Cap 表示切片容量,cap >= len,该参数可选,默认cap=len 例如: slice := make([]string,5) //初始化一个字符串类型的切片,长度和容量均为5slice := make([]string... Read More >
201806-27 SOAP--------Golang对接WebService服务实战 背景 最近项目中在对接某保险公司线上webService接口时,无奈Golang没有像java那般有现成的jar包或库使用,只好从底层基于soap协议通过http post来实现对接。对接过程中,由于开始并未注意版本问题(webService接口使用soap1.2协议版本,对接时使用soap1.1协议版本),导致很长时间对接报500返回。 soap 简介 SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换... Read More >
201806-26 DES--------Golang对称加密之模式问题实战 1. 背景 近期项目在对接第三方产品,传输过程中涉及到数据加密, 数据加密流程为: 发送数据DES加密 DES加密后的数据进行base64编码 发送,接受数据 接受读取的数据进行base64解码 base64解码完的数据机型DES解密 由于采用golang对接,文档且无说明情况下,默认采用CBC模式加解密,导致很长时间对接不上。后通过对方Java Demo代码查看得知采用ECB加密模式,Java默认DES算法使用DES/ECB/PKCS5Padding工作方式,在GO语言... Read More >
201806-25 golang Protobuf学习 protobuf是一种高效的数据传输格式(Google's data interchange format),且与语言无关,protobuf和json是基于http服务中最常见的两种数据格式。今天来学习基于golang的protobuf相关内容。 google protocol buffer: https://developers.google.com/protocol-buffers/golang 官方提供的protobuf支持插件:https://git... Read More >
201806-24 Glide--------Golang依赖包解决工具之错误实践 1. 背景 不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题。Java有牛逼轰轰的Maven和Gradle。 Golang亦有godep、govendor、glide、gvt、gopack等等,本文主要给大家介绍gilde。 glide是Golang的包管理工具,是为了解决Golang依赖问题的。 为什么需要glide? 原因很简单,Go 语言原生包管理的缺陷。罗列一下golang的 get 子命令管理依赖有很多大缺陷: * 能拉取源码的平台... Read More >
201806-23 golang 按字符读取文件 package main import ( "bufio" "fmt" "io/ioutil" "os" "strings" ) func main() { arguments := os.Args if len(arguments) == 1 { fmt.Println("Not enough arguments!") os.Exit(1) } input := arg... Read More >
201806-22 golang 实现文件拷贝的2种方式 package main import ( "fmt" "io" "os" "path/filepath" "strconv" ) var BUFFERSIZE int64 func Copy1(src, dst string, BUFFERSIZE int64) error { sourceFileStat, err := os.Stat(src) if err != nil { return e... Read More >
201806-21 golang symbolic links package main import ( "fmt" "os" "path/filepath" ) func main() { arguments := os.Args if len(arguments) == 1 { fmt.Println("Please provide an argument!") os.Exit(1) } filename := arguments[1]... Read More >
201806-20 Go(8[Goroutine | Channel | 读写锁 | 异常处理 ]) 进程和线程1. 进程是程序在操作系统中的⼀次执⾏过程,系统进口资源分配和调度的一个独力单位。2. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独力运行的基本单位。3. 一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行Goroutine并发和并行多线程程序在一个核的CPU上运行,就是并发多线程程序在多个核的CPU上运行,就是并发设置GO运行的CPU核数func Test1() { num := runtime.Num... Read More >
201806-19 解决XORM的时区问题 如果你升级使用了较为新版xorm(如v0.6.3)和go-sql-driver(如v1.3)的go类库,那么你就可能会遇到时区问题。 如 time.Parse("2006-01-02 15:04:05" ,"2018-01-15 12:11:12") // 2018-01-15T12:11:12+00:00 写入是数据库时候就会被改变为2018-01-15T20:11:12+00:00。 上述的就是时区问题,因为我们使用的是东8时区,默认会被设置为0时区,解决方案很简单,... Read More >
201806-18 Go(7 [终端读写| 文件操作 | 命令行参数 | Json序列化]) 终端读写操作终端相关文件句柄常量os.Stdin:标准输入os.Stdout:标准输出os.Stderr:标准错误输出终端读写示例://Sscanf 是从变量中读取值package mainimport "fmt"var ( firstName,lastName ,s string i int f float32 input = "56.12 / 5212 / Go" format = "%f/%d/%s")func main() { ... Read More >
201806-17 lumen中用swoole实现RPC服务 背景因老项目众多,既有原生PHP也有TP3.2还有其他一些乱七八糟的项目,导致维护困难,经常同一份代码要写到好几个项目中,copy来copy去,也经常发生改了一个地方,其他地方没改全的问题,因为我们决定做一个小型的微服务项目,通过RPC调用,让后续的项目维护变得简单和高效可能遇到的问题和风险作为基础项目,如果发生宕机或者其他问题,会导致调用的其他项目都发生问题 因此,他的高可用性就非常重要,应对方案如下: 我们暂时采用内网负... Read More >
201806-17 Go(6 [反射]) 反射:可以在运行时动态获取变量的相关信息reflect.TypeOf,获取变量的类型,返回reflect.Type类型reflect.ValueOf,获取变量的值,返回reflect.Value类型reflect.Value.Kind,获取变量的类别,返回一个常量reflect.Value.Interface(),转换成interface{}类型修改变量的值类型检查代码func getTypeInfo(a interface{}) { typeInfo := reflect... Read More >
201806-16 swoole中固定包头格式 概念固定包头协议是在实际应用中最常用的协议。该协议的内容是规定一个固定长度的包头,在包头的固定位置有一个指定好的字段存放了后续数据的实际长度。这样,服务器端可以先读取固定长度的数据,从中提取出长度,然后再读取指定长度的数据,即可获取一段完整的数据。Swoole 支持了 2 种类型的自定义网络通信协议。EOF 结束符协议EOF 协议处理的原理是每个数据包结尾加一串特殊字符表示包已结束。如 Memcache、FTP、SMTP&nb... Read More >
201806-16 Go(6 [接口 类型断言]) Go接口 Interface定义:Interface类型可以定义⼀组⽅法,⽤来表示⼀个对象的⾏为特征。 interface不能包含任何变量。代码:interface关键字定义接口类型,接口是引用类型是抽象的,具体的类才可以调用type Aniaml interface { //定义2个是行为特征,方法 Eat() Talk() }定义2个struct//只要一个具体的struct实现这个接口的类型的所有方法,也就是具有这个接口的所有行为特征,都是可以存... Read More >
201806-15 go 语言中的类型及数据结构 这章主要描述如何定义变量、常量、go内置类型及go程序设计中的一些技巧 定义变量 go中定义变量的方式很多: 使用var关键字是最基本的定义变量的方式,与C语言有些不同,如下:var variable_name type 定义多个变量var name1,name2,name3 type 定义变量同时初始化var name1 string = "liming" 同时初始化多个变量var name1,name2,name3 string = "a", "c", "d" 直接忽略类... Read More >
201806-14 Go(5 [struct | tag | 方法 | 继承 ]) Go struct用来自定义复杂数据结构struct里面可以包含多个字段(属性),字段可以是任意类型struct类型可以定义方法,注意和函数的区别struct是值类型,也就是,赋值的时候,就是copy一份,不会修改原来的值, struct类型可以嵌套Go中没有class类型,只有struct类型make ⽤来分配map、 slice、 channel类型的内存,new用来分配值类型的内存Struct定义:声明:type 标识符 struct{ filed1 ... Read More >
201806-14 PHP程序员解决问题能力的六个级别 青铜 var_dump/die打印变量值信息单步调试是最简单粗暴有效的解决问题方法。高级一点的是使用打印日志。白银 会设置各种错误日志的记录和显示,并根据各种错误日志分析错误或者搜索别人的解决方案php.ini 设置错误记录display_errors = On error_reporting = E_ALL | E_STRICT error_log = /data/wwwlogs... Read More >