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

Go 1.8中值得关注的几个变化

在已经过去的2016年,Go语言继在2009年之后再次成为编程语言界的明星- 问鼎TIOBE 2016年度语言。这与Go team、Go community和全世界的Gophers的努力是分不开的。按计划在这个2月份,Go team将正式发布Go 1.8版本(截至目前,Go的最新版本是Go 1.8rc3)。在这里我们一起来看一下在Go 1.8版本中都有哪些值得Gopher们关注的变化。 一、语言(Language) Go 1.8版本依旧坚守Go Team之前的承诺,即Go1兼容性:使用Go 1.7及以前版本编写的Go代码,理论上都可以通过Go 1.8进行编译并运行。因此在臆想中的Go 2.0变成现实之前,每个Go Release版本在语言这方面的“改变”都会是十分微小的。 1、仅tags不同...阅读全文

博文 二月 3, 2017 bigwhite

30分钟上手GO语言--基础语法

本章主要分成三个部分:第一部分包括基本语法和数据结构;第二部分讨论方法和接口;第三部分介绍并发机制。 包、变量和函数 先看一个例子Packages.go: ```golang package main import ( "fmt" "math/rand" ) func add(x int, y int) int { return x + y } func main() { fmt.Println("My favorite number is", rand.Intn(10)) fmt.Println(add(42, 13)) } ``` 包:每个 Go 程序都是由包(package)组成的,程序运行的入口是包 `main`。 ...阅读全文

go,Buffer以及相关数据类型

## 主要内容 ## - 在go代码中经常见到bytes.Buffer类型数据 - bytes.Buffer这个数据跟 []byte之间有什么关系呢 - bytes.Buffer相关的数据类型之间转换 ---------- bytes.Buffer bytes是这个包的名字,bytes.Buffer则是一种缓存数据类型. type Buffer struct { buf []byte off int // read at &buf[off], write at &buf[len(buf)] runeBytes...阅读全文

搞定淘宝,京东 api调用返回的奇葩json格式

淘宝,京东的api调用返回的json格式跟golang的标准库encoding/json中的格式不兼容。 淘宝有些地方习惯性的把float数据加""变成字符串格式 比如 "delivery_score": "0.0", 文档上的又不一样 "delivery_score": 90, 京东的习惯是,不管是不是字符串类型都都加"",变成字符串类型的。 这样就造成标准库无法识别这些格式, 我把json拷贝出来,在decode.go文件的661行的literalStore函数种修改了:字符串处理方式代码如下: case '"': // string s, ok := unquoteBytes(item) if !ok { if fromQuoted { ...阅读全文

Go1.8正式发布

今天Go团队很高兴地宣布Go 1.8发布了。你可以从下载页面获得1.8版本。在这个版本中,整个标准库有显着的性能改进和变化。Go 1.7中为64位x86系统引入的编译器后端现在用于所有体系结构,在这些体系结构下可以看到显着的性能改进。例如,我们的基准程序所需的CPU时间在32位ARM系统上减少了20-30%。在此版本中,对于64位x86系统也有一些性能提升。编译器和链接器跑得更快。编译时间应该比Go 1.7缩短约15%。在这一领域还有更多的工作要做:希望未来版本的编译速度更快。垃圾收集暂停应明显更短,通常在100微秒以下,通常低至10微秒。HTTP服务器添加对HTTP/2 Push的支持,允许服务器向客户端推送。这对于消除网络延迟非常有用。 HTTP服务器还添加了对优雅停机的支持,允许服务器...阅读全文

分享文件或路径相关的便利函数

Go 标准库不少函数封装很少,不像 PHP 那样,很多功能一个函数搞定。这里封装了一些文件或路径的便利操作,方便使用。 package files import ( "os" ) // 检查文件或目录是否存在 // 如果由 filename 指定的文件或目录存在则返回 true,否则返回 false func Exist(filename string) bool { _, err := os.Stat(filename) return err == nil || os.IsExist(err) } // 列出指定路径中的文件和目录 // 如果目录不存在,则返回空slice func Scan...阅读全文

快速可靠协议 kcp-go

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。     整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。 ** Features(特性) ** * 100% compatible with original...阅读全文

开源项目 2016-03-07 00:00:00 xtaci

快速排序

// QuickSort project main.go package main import ( "fmt" "math/rand" "time" ) func main() { var my_slice = make([]int, 0, 100) rand.Seed(int64(time.Now().Nanosecond())) for i := 0; i < 10; i++ { my_slice = append(my_slice, rand.Intn(1001)) } fmt.Println("Before The Quick Sort:") fmt.Println(my_sli...阅读全文

主题 2013-07-24 10:45:29 hrenlo

Go性能优化技巧1/10

字符串(string)作为一种不可变类型,在与字节数组(slice, [ ]byte)转换时需付出 “沉重” 代价,根本原因是对底层字节数组的复制。这种代价会在以万为单位的高并发压力下迅速放大,所以对它的优化常变成 “必须” 行为。 首先,须了解 string 和 [ ]byte 数据结构,并确认默认方式的复制行为。 ![source](http://studygolang.qiniudn.com/160428/a01e98e972abb87f20d0dc9edaa1fd17.jpg) ![gdb](http://studygolang.qiniudn.com/160428/4069f099cbb9753061fb4acf82227a46.jpg) 动态演示: [https://as...阅读全文

golang append

1) Append a slice b to an existing slice a: a = append(a, b...) 2) Copy a slice a to a new slice b: b = make([]T, len(a)) copy(b, a) 3) Delete item at index i: a = append(a[:i], a[i+1:]...) 4) Cut from index i till j out of slice a: a = append(a[:i], a[j:]...) 5) Extend slice a with a new slice of length j: a = append(a, make([]T, j)...) 6) Insert ...阅读全文

博文 2014-07-02 10:30 GnagWang

深入理解golang — 数组(array)、切片(slice)、map

我比较喜欢先给出代码,然后得出结论 数组 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 arr := [...]int{1, 2, 3} 9 //打印初始的指针 10 fmt.Printf("the pointer is : %p \n", &arr) 11 printPointer(arr) 12 } 13 14 func printPointer(any interface{}) { 15 fmt.Printf("the pointer is : %p \n", &any) 16 } 结果 1 the pointer is : 0xc082008580 2 the pointer is : 0xc0820001d0...阅读全文

博文 2014-10-04 19:26:16 aqsmoke

深入理解go的slice和到底什么时候该用slice

# 深入理解go的slice和到底什么时候该用slice ## 前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 ## 先了解一下slice的特性 * 定义一个slice ```go s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] ``` 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。...阅读全文

gdb调试golang中的内部运行时信息(如:goroutine)

最近使用Go写crawler,使用gdb后发现不能显示gorountine的信息。 查看了下golang的文档 https://golang.org/doc/gdb >A recent extension mechanism to GDB allows it to load extension scripts for a given binary. The tool chain uses this to extend GDB with a handful of commands to inspect internals of the runtime code (such as goroutines) and to pretty print the built-in map, sl...阅读全文

十条有用的 GO 技术

1. 使用单一的 GOPATH 2. 将 for-select 封装到函数中 3. 在初始化结构体时使用带有标签的语法 4. 将结构体的初始化拆分到多行 5. 为整数常量添加 String() 方法 6. 让 iota 从 a +1 开始增量 7. 返回函数调用 8. 把 slice、map 等定义为自定义类型 9. withContext 封装函数 10. 为访问 map 增加 setter,getters 原文链接:[Ten Useful Techniques in Go](http://arslan.io/ten-useful-techniques-in-go) 中文翻译:[十条有用的 GO 技术](http://mik...阅读全文

1对N的通信方式请教

1个serv goroutine需要和5000以上可变数量的client goroutine通过chan通信,client作为send发送数据量较大,请问serv与client能通过chan[ ] string 来通信吗?serv端如何监控这个 chan slice呢?貌似select无法完成?如果只能用一个异步chan来完成,在serv端for range chan时是否能保证一个client所发送消息的有序被处理?性能上有什么好的建议?谢...阅读全文

go语法速记(抄来的)

Golang语法与代码格式速记 Posted on 2013-08-02 16:15 oathleo 阅读(1795) 评论(0) 编辑 收藏 所属分类: Golang // Description: Golang语法与代码格式速记 // Author: cxy // Date: 2013-04-01 // Version: 0.3 // TODO 说明 // TODO package // Go是采用语法解析器自动在每行末尾增加分号,所以在写代码的时候可以把分号省略。 // Go编程中只有几个地方需要手工增加分号,如: for循环使用分号把初始化,条件和遍历元素分开。在一行中有多条语句时,需要增加分号。 // 不能把控制语句(if, for, swi...阅读全文

Go 性能优化技巧 9/10

作为内置类型,通道(channel)从运行时得到很多支持,其自身设计也算得上精巧。但不管怎么说,它本质上依旧是一种队列,当多个 goroutine 并发操作时,免不了要使用锁。某些时候,这种竞争机制,会导致性能问题。 下面是一个简单利用 channel 收发数据的示例,为便于 “准确” 测量收发操作性能,我们将 make channel 操作放到外部,尽可能避免额外消耗。 ![channel1](http://studygolang.qiniudn.com/160612/c4c5769a4bb13b0bfc57656464ecc3e6.jpg) 在研究 go runtime 源码实现过程中,会看到大量利用 “批操作” 来提升性能的样例。在此,我们可借鉴一下,看看效果对比。 ...阅读全文

Go 1.8 正式发布,编译时间比 Go 1.7 提高约 15%

go语言交流群185521558,欢迎你的加入:点击链接加入群【Golang技术交流】:https://jq.qq.com/?_wv=1027&k=43awu7x 今天Go 团队很高兴地宣布Go 1.8发布了。现已提供下载。整个标准库有了显著的性能提升和变化。该版本主要的更新内容如下: Go 1.7中为64位x86引入的编译器后端现在用于所有体系结构,这些体系结构将会有显著的性能改进。例如,我们的基准程序所需的CPU时间在32位ARM系统上减少了20-30%。在此版本中,64位x86系统还有一些性能改进,编译器和链接器更快了,编译时间应该比Go 1.7提高约15%。但是在这一领域还有很长的路要走:我们希望在未来版本中实现更快的编译速度。 垃圾收集暂停时间明显更短,通常在10...阅读全文

map键值的疑问

在effective_go文档中,关于map类型key的取值上说接口类型也可以做key,但是附加条件是只要动态的类型支持即可。 不知道martini中使用的函数 func InterfaceOf(value interface{}) reflect.Type 最终返回的是不是反射包里的以下struct: ``` // interfaceType represents an interface type. type interfaceType struct { rtype `reflect:"interface"` methods []imethod // sorted by hash } ``` 如果是,但文档中指出struct带有slice字段是能不做为ma...阅读全文

代码生成工具 go-itergen

**go-itergen** 解决了 Go 一个常规而又非常重要的问题:没有映射,没有过滤器,什么都没有。如果你是函数式背景会感到非常苦恼,现在 got-itergen 提供 Go 的常规函数生成功能,为可迭代的类型生成常规函数,比如 map 和 filter。 go-itergen 支持的操作: * **Map** * **Filter** * **All** * **Some** * **Concat** * **Find** * **ForEach** * **Reverse** * **Splice** * **Reduce** 生成代码:

...阅读全文

利用container/heap包实现线程安全的优先级队列

文章来源:http://www.bityeah.com 利用Go的 container/heap 可以很方便的实现堆排序的队列,heap包中的示例代码有一个优先级队列的实现,但是并不是线程安全的,因此,要实现线程安全的优先级队列,需要堆示例代码稍作修改, 下面为 container/heap 包的示例代码: // This example demonstrates a priority queue built using the heap interface. package main import ( "container/heap" "fmt" ) // An Item is something we manage i...阅读全文

命令行程序示例集

[**CLI**](https://github.com/mkideal/cli)是一个非常小巧,便于使用且功能丰富的用于构建命令行程序的库。为了让大家更加容易上手,特此撰写了二十几个程序示例。每个示例都非常简单,通常只用来阐明一个特性的使用方法。 * [Example 1: Hello world](http://www.mkideal.com/golang/cli-examples.html#example-1-hello) * [Example 2: How to use **flag**](http://www.mkideal.com/golang/cli-examples.html#example-2-flag) * [Example 3: How to use **requ...阅读全文

Go性能优化技巧2/10

对于一些初学者,自知道 Go 里面的 array 以 pass-by-value 方式传递后,就莫名地引起 “恐慌”。外加诸多文章未作说明,就建议用 slice 代替 array,企图避免数据拷贝,提升性能。实际上,此做法有待商榷。某些时候怕会适得其反,倒造成不必要的性能损失。 用个简单的示例说明。 ![示例](http://studygolang.qiniudn.com/160530/c9762c55369432b1967d30fa678f0c7a.jpg) 代码很简单,两个函数分别返回 “内容相同” 的 array 和 slice。为避免编译器优化,特填充了全部数据,以模拟 “真实” 数据复制行为。接下来,看看性能测试对比。 ![性能](http://studyg...阅读全文

关于Go内置的http 包的Post数据的问题

postform 这个玩意里面有个url.value 这个,他里面的东西只支持String,怎么办?我要放一个int进去 他给我报了个cannot use 25423901 (type int) as type string in array or slice literal 代码如下 respDomainRecord,err := http.PostForm("http://dnsapi.cn/Record.List",url.Values{"login_email":{login_email},"login_password":{login_password},"format":{"json"},"domain_id":{25423901}}) if err !=nil{ ...阅读全文

golang append

1) Append a slice b to an existing slice a: a = append(a, b...) 2) Copy a slice a to a new slice b: b = make([]T, len(a)) copy(b, a) 3) Delete item at index i: a = append(a[:i], a[i+1:]...) 4) Cut from index i till j out of slice a: a = append(a[:i], a[j:]...) 5) Extend slice a with a new slice of length j: a = append(a, make([]T, j)...) 6) Insert ...阅读全文

博文 2016-04-15 20:12 -mok-

编写地道的Go代码

目录 [−] 注释声明slice关于字符串大小写处理error而不是panic或者忽略尽量减少代码缩进一些名称package级的Error变量空字符串检查非空slice检查省略不必要的变量直接使用bool值byte/string slice相等性比较检查是否包含子字符串使用类型转换而不是struct字面值复制slice不要在for中使用多此一举的true尽量缩短if简化range正则表达式中使用raw字符串避免转义字符简化只包含单个case的selectslice的索引使用time.Since使用strings.TrimPrefix/strings.TrimSuffix 掐头去尾使用工具检查你的代码参考文档 在阅读本文之前,我先推荐你阅读官方的 Effective Go文档,或者是中文翻译版...阅读全文

博文 2017年02月07日 smallnest

理解Go语言的nil

最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频。 nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于nil的时候,说明出现某些错误了,需要我们对这个错误进行一些处理,而如果等于nil说明运行正常。那什么是nil呢?查一下词典可以知道,nil的意思是无,或者是零值。零值,zero value,是不是有点熟悉?在Go语言中,如果你声明了一个变量但是没有对它进行赋值操作,那么这个变量就会有一个类型的默认零值。这是每种类型对应的零值: bool -> false numbers -> 0 string -...阅读全文

博文 2017.02.27 23:41 天唯

What is the benefit of decoding strings with utf8 or converting the string to a []rune?

<p>I&#39;ve been working on porting a really small (and worthless) scripting language from Ruby to Go, mostly for learning but also for other projects I plan to build in the future. In doing this, I&#39;ve been building the lexer based on <a href="https://www.youtube.com/watch?v=HxaD_trXwRE">this video by Rob Pike</a&...阅读全文

资源 2015-05-06 10:48:22 blov

Assignability(意译)

只有在下述情况中,一个 value x 才能被赋值到一个 type 为 T 的 variable 中: - x 的 type 和 T 是 identical。 - 假设 x 的 type 是 V 。 V 和 T 具有相同的 underlying type , V 和 T 至少有一个不是 named type。 - T 是一个 interface type , x implements T。 - x 是一个 双向 channel 的 value , T 是一个 channel type , x 的 type V 和 T 拥有同样的元素 type , 同时, V 和 T 至少有一个不是 named type。 - x 是预声明的标识符 nil , T 是 ...阅读全文

go语言基本数据类型

初识GO语言 go是一门新语言,他在语言级提供了并发的支持(goroutine)和通信工具channel,同时它也是一门编译型、强类型的语言,拥有内存GC机制。程序的模块通过package来组织。 GO基础 整数 十进制整数,使用0-9的数字表示且不以0开头。 八进制整数,以0开头,0-7的数字表示 十六进制整数,以0X或者是0x开头,0-9|A-F|a-f组成 100 123455 0100 0600 0xff 0xFF12 浮点数 浮点数由整数部分、小数点和小数部分组成,整数部分和小数部分可以隐藏其中一种。也可以使用科学计数法表示: 0. 72.40 072.40 和72.40一样 2.71823 1.e+0 6.67428e-11 1E6 .25 .12345E+5 复数的虚部 由一个...阅读全文

博文 2016-12-05 15:50 sydnash

Go new和make的区别 && 数组和切片

Go new和make的区别以及切片的本质 make、new操作 make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。 内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要: new返回指针。 内建函数make(T, args)与new(T)有着不同的功能,make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部arr...阅读全文

博文 2017-02-13 02:00:09 xxggy

golang append的并发问题

先看一段代码 ackage main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup s := make([]int, 0, 1000) for i := 0; i < 1000; i++ { v := i wg.Add(1) go func() { s = append(s, v) wg.Done() }() } wg.Wait() fmt.Printf("%v\n", len(s)) } 结果 第一次:928 第二次:945 第三次:986 …… 多运行几次你就会发现,slice长度并不是1000,而是不停的在变,为什么呢? 因为append并不是并发安全的。 我们举一个简单例子,比如,当A和B两个协程运行appen...阅读全文

博文 2017-02-15 23:23:00 woodane

Golang - SelectionSort

//We start selection sort by scanning the entire list to //find its smallest element and exchange it with the first //element, putting the smallest element in its final position in //the sorted list. Then we scan the list, starting with the second //element, to find the smallest among the last n-1 elements //and exchange it with the second element,...阅读全文

博文 2015-03-31 21:10 zhangle234

(Go)不要使用append插入元素

标题好像有点唬人哦…. 起因是我在给Slice做Insert函数,给几个版本封装时做了一些性能测试。结果出人意料! import ( "fmt" "reflect" "time" ) func copyInsert(slice interface{}, pos int, value interface{}) interface{} { v := reflect.ValueOf(slice) v = reflect.Append(v, reflect.ValueOf(value)) reflect.Copy(v.Slice(pos+1, v.Len()), v.Slice(pos, v.Len())) v.Index(pos).Set(reflect.ValueOf(value)) retur...阅读全文

博文 2016-11-07 21:22 Begosu

Type identity(意译)

两种类型要么是 identical(完全一致的),要么是different(不同的)。 1.两种 named type, 如果 传承自同样的 TypeSpec(声明),那么就是 identical(自己跟自己相同,除此之外任何两种 named type 都不同) ,否则就是 different。 2.对于 unnamed type ,判定 identical 具体规则如下: -- array type:其中元素类型和数组长度都相同。 -- slice type:具有相同的元素类型。 -- struct type:具有相同的 field(强调顺序相同);field name 相同;field type 相同;field tag 相同。关于匿名 fie...阅读全文