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

对Golang interface的理解

理解golang的interface主要在于以下两点: interface是方法的集合 interface是一种类型 简单示例 package main import "fmt" type Animal interface { Speak() string } type Cat struct{} func (c Cat) Speak() string { return "cat" } type Dog struct{} func (d Dog) Speak() string { return "dog" } func Test(params interface{}) { fmt.Println(params) } func main() { animals := []Animal{Cat{}...阅读全文

博文 2017-06-27 13:08:38 GoDev

map按key和按value排序

看一个题: 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 96 jack 70 Tom 70 smith 67 从低到高 smith 67 Tom 70 jack 70 peter 96 1、按照value排序 2、可以递增排序和递减排序 3、保证排序的稳定性 golang map按key排序 //golang的map不保证有序性,所以按key排序需要取出key,对key排序,再遍历输出value package main import ( "fmt" "sort" ) func main() { // To c...阅读全文

博文 2017-07-31 04:06:16 zengfan

go字符串截取笔记

当我在go语言编程过程中第一次碰到需要截取字符串的时候,首先想到的是 strings 包里面可能有相关方法~ 我还是太年轻了,这些年都被脚本语言惯坏了~ 好吧,只能自己搞了,思路也很清晰,把字符串转成字节数组,然后使用slice切片得到其中想要截取的一段,最后再通过 T() 强制类型转换还原成字符串,一开始比较简单: s := "abcdefg" s = string([]byte(s)[:3]) fmt.Println(s) //得到 "abc" 似乎简单啊,但如果碰到中文咋办?根据常识,一个中文字符肯定不止一个字节,难道我还得遍历每个字节,判断编码,判断ascii码范围?那也太麻烦了吧,当然如果必须这么处理的话,肯定人已经造过轮子,google一下定有收获。 幸运的是我不需要考虑那么多,...阅读全文

博文 2017-02-18 04:00:32 吾爱

Golang中Slice的append详解

在Golang语言中,数据类型不多,但是够用,开发项目过程中,Slice属于最常用的数据结构之一,对其原理理解不清楚,很容易会遗留bug,笔者查询了很多博客资料,对Slice的append原理进行一个总结,如果有写的不清楚不明白之处,请多多包涵,并予以指正。 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("c...阅读全文

博文 2017-09-05 07:34:51 tomorrowwu

Golang中用interface{}接收任何参数与强转

函数的传值中,interface{}是可以传任意参数的,就像java的object那样。 下面上我第一次想当然写的 ** 错误 **代码 package main func main() { Any(2) Any("666") } func Any(v interface{}) { v1:=int(v) println(v1) } 我只是想它能通过编译而已,因为上面的错误代码并没有任何的语法错误,心里只有666想说,下面是编译的错误提示: cannot convert v (type interface {}) to type int: need type assertion 正确的代码就可以保证程序不出什么差错。 package main func main() { Any(2) Any(...阅读全文

博文 2017-09-16 13:04:54 送你一碗大麦茶

Go 系列教程 —— 11. 数组和切片

欢迎来到 [Golang 系列教程](/subject/2)的第 11 章。在本章教程中,我们将讨论 Go 语言中的数组和切片。 ## 数组 数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(译者注:当然,如果是 interface{} 类型数组,可以包含任意类型) ### 数组的声明 一个数组的表示形式为 `n[T]`。`n` 表示数组中元素的数量,`T` 代表每个元素的类型。元素的数量 `n` 也是该类型的一部分(稍后我们将详细讨论这一点)。 可以使用不同的方式来声明数组,让我们一个一个的来看。 ```go package main import ( "fmt" ) func main() ...阅读全文

博文 2018-01-07 20:41:48 Dingo1991

golang 字符串常用操作(go练习代码)

练习golang string常用操作,备份 类型转换 比较对比 搜索 查找 统计 替换 删除过滤 大小写转换 前缀后缀 字符串分割 拼接 3中拼接字符串方式对比 func main() { fmt.Println("字符串测试") fmt.Println("字符串转化") //获取程序运行的操作系统平台下 int 类型所占的位数,如:strconv.IntSize。 //strconv.IntSize fmt.Println("将字符串转换为 int 型。") var trastr01 string = "100" traint01, err_tra := strconv.Atoi(trastr01) if err_tra != nil { fmt.Println(err_tra) } e...阅读全文

博文 2017-10-17 05:04:48 正为疯狂

golang 数组和切片初始化方式

一、数组初始化方式 var [length]Type var array [5]int //这种方式,只是初始化,不带初始化值,数组长度,已经定义好, 但是其实初始化的值,已经有了并且是该类型的最小值(bool false),int 0, string ' ' 其他,自行验证 var [N]Type{value1, value2, ... , valueN} var array = [5]int{1, 2, 3, 4, 5} // 这种方式,既初始化变量,又带了初始化值,数组长度已经定义好 var [...]Type{value1, value2, ... , valueN} var array = [...]int{1, 2, 3, 4, 5} // 这种方式,既初始化变量,也是带了初始值...阅读全文

博文 2018-08-29 13:34:57 Tim_SSS

Go 语言“可变参数函数”终极指南

![Variadic Funcs](https://raw.githubusercontent.com/studygolang/gctt-images/master/variadic-func/title.png) ### 什么是可变参数函数? 可变参数函数即其参数数量是可变的 —— 0 个或多个。声明可变参数函数的方式是在其参数类型前带上省略符(三个点)前缀。 >译者注:“可变参数函数”在一些翻译中也称“变长函数”,本篇译文中采用“可变参数函数“ ![what is variadic func](https://raw.githubusercontent.com/studygolang/gctt-images/master/variadic-func/what_is_variadic_fu...阅读全文

博文 2017-12-16 13:11:49 shockw4ver

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

博文 2017-02-06 03:23:51 bigwhite

理解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-28 05:13:34 天唯

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

Golang 切片与函数参数“陷阱”

线性结构是计算机最常用的数据结构之一。无论是数组(arrary)还是链表(list),在编程中不可或缺。golang也有数组,不同于别的语言,golang还提供了切片(slice)。切片比数组有更好的灵活性,具有某些动态特性。然而切片又不像动态语言的列表(Python list)。不明白切片的基本实现,写程序的时候容易掉“坑”里。 slice参数 本来写一个堆排序,使用了golang的slice来做堆,可是发现在pop数据的时候,切片不改变。进而引发了golang函数切片的参数,是传值还是传引用呢?我们知道slice相比array是引用类型。那么直觉上告诉我们如果函数修改了参数的切片,那么外层的切片变量也会变啦。 func main() { slice := []int{0, 1, 2, 3...阅读全文

博文 2017-05-26 11:59:23 人世间

go语言坑之for range

go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组、切片和映射。但是在使用for range时,如果使用不当,就会出现一些问题,导致程序运行行为不如预期。比如,下面的示例程序将遍历一个切片,并将切片的值当成映射的键和值存入,切片类型是一个int型,映射的类型是键为int型,值为*int,即值是一个地址。 package main import "fmt" func main() { slice := []int{0, 1, 2, 3} myMap := make(map[int]*int) for index, value := range slice { myMap[index] = &value } fmt.Println...阅读全文

博文 2017-04-13 07:18:17 songleo

(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-22 04:00:05 Begosu

Go语言中连接多个字符串

本文参考自How to efficiently concatenate strings in Go?和Efficient String Concatenation in Go。 (1)直接使用“+=”: package main import ( "fmt" "strconv" ) func main() { s := "" for i := 0; i <= 9; i++ { s += strconv.Itoa(i) } fmt.Println(s) } 因为字符串类型在Go中是不可改变的,因此每次操作实际都要新分配字符串,所以在字符串比较多的时候效率不高。 (2)使用strings.Join()函数: package main import ( "fmt" "strconv" "strin...阅读全文

博文 2017-06-25 14:12:05 肖楠

Golang hashmap 的使用及实现

基本语法 定义hashmap变量 由于go语言是一个强类型的语言,因此hashmap也是有类型的,具体体现在key和value都必须指定类型,比如声明一个key为string,value也是string的map, 需要这样做 var m map[string]string // 声明一个hashmap,还不能直接使用,必须使用make来初始化 m = make(map[string]string) // 初始化一个map m = make(map[string]string, 3) // 初始化一个map并附带一个可选的初始bucket(非准确值,只是有提示意义) m := map[string]string{} // 声明并初始化 m := make(map[string]string) ...阅读全文

博文 2017-08-22 10:05:03 51reboot

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

快速可靠协议 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-06 16:00:00 xtaci

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服务器还添加了对优雅停机的支持,允许服务器...阅读全文

博文 2017-02-17 01:11:39 方圆

Golang比较两个slice是否相等

Compare two string slices in GoLang 开发中经常会遇到需要比较两个slice包含的元素是否完全相等的情况,一般来说有两个思路: reflect比较的方法 循环遍历比较的方法 这里用检查两个字符串slice是否相等的例子来测试一下这两种思路的效率我当然知道你知道reflect方法效率更差啦 reflect比较的方法 func StringSliceReflectEqual(a, b []string) bool { return reflect.DeepEqual(a, b) } 这个写法很简单,就是直接使用reflect包的reflect.DeepEqual方法来比较a和b是否相等 这是我最初完成这个需求的方式,年轻嘛,比较天真,觉得reflect啊,高端大...阅读全文

博文 2017-04-13 07:17:14 Kenshinsyrup

搞定淘宝,京东 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 { ...阅读全文

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-09 09:00:04 sydnash

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

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

深入理解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-05 08:24:15 aqsmoke

Golang 中 strings.builder 的 7 个要点

自从 Go 1.10 发布的一个月以来,我多少使用了一下 `strings.Builder`,略有心得。你也许知道它,特别是你了解 `bytes.Buffer` 的话。所以我在此分享一下我的心得,并希望能对你有所帮助。 ## 1. 4 类写入(write)方法 与 `bytes.Buffer` 类似,`strings.Builder` 也支持 4 类方法将数据写入 builder 中。 ```go func (b *Builder) Write(p []byte) (int, error) func (b *Builder) WriteByte(c byte) error func (b *Builder) WriteRune(r rune) (int, error) func (b *Bu...阅读全文

博文 2018-04-14 10:58:21 snowInPluto

Golang中参数传递详解

关于参数传递,Golang文档中有这么一句: after they are evaluated, the parameters of the call are passed by value to thefunction and the called function begins execution. 函数调用参数均为值传递,不是指针传递或引用传递。经测试引申出来,当参数变量为指针或隐式指针类型,参数传递方式也是传值(指针本身的copy) Slice是最常用的数据结构之一,下面以Slice为例,解释Golang的参数传递机制。 Slice数据结构如下: image 示例代码: package main import "fmt" func main(){ slice := make([]in...阅读全文

博文 2017-07-14 13:06:25 wuming

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-10-04 19:26:01 GnagWang

Go圣经-学习笔记入门-面试题

常问面试题 函数返回return XX, 是原子操作吗?(不是, 如果你看过雨痕老师的内存管理,就知道) 普通函数和闭包函数的区别有哪些?后者的应用场景在哪里?(闭包函数使用外部变量,是引用传递,注意:闭包函数运行时使用到该变量时,获取当时该变量的值。应用场景:闭包函数要比较小,有点像内联函数,用于defer等其他场景-关闭连接等) make和new有什么区别(make用于channel、map和slice的创建并初始化零值。new是指针对象。Effective Go中有个例子) var p *[]int = new([]int) // p=nil, 没有任何用处,只是分配了一个指针对象 var v []int = make([]int, 100) // 而make则分配了长度和容量等于10...阅读全文

博文 2017-10-22 00:30:04 cdh0805010

Go bytes包

Go bytes包 bytes包基本方法的使用 package main import ( "bytes" ) func writeUInt16(buff []byte, data uint16) { for i := 0; i < 2; i++ { buff[i] = byte(data >> uint(i*8)) } } func spilt(r rune) bool { if r == 'c' { return true } return false } func main() { println("hello world") buff1 := make([]byte, 2) // 创建一个切片 writeUInt16(buff1, uint16(12)) buff2 := make(...阅读全文

博文 2017-02-10 08:00:40 xxggy

Golang中range的使用方法及注意事项

一、用法range类似迭代器,可以遍历数组,字符串,map等等,对象的不同,返回的结果也不同。 12345678910111213141516171819package mainimport "fmt"func main(){ //数组的遍历 a := [3]int {1, 2, 3} for i, n := range a{ fmt.Println(i, n) } //切片的遍历 b := []int{2, 3, 4} for i, n := range b{ fmt.Println(i, n) } //map的遍历 c := map[string]int{"Hello":1, "World":2} for k, v := range c{ fmt.Println(k, v) }} 结果:...阅读全文

博文 2018-05-17 09:25:56 马谦的博客

golang – fmt 格式化参数

文 基本 %v the value in a default format when printing structs, the plus flag (%+v) adds field names %#v a Go-syntax representation of the value %T a Go-syntax representation of the type of the value %% a literal percent sign; consumes no value The default format for %v is: bool: %t int, int8 etc.: %d uint, uint8 etc.: %d, %#x if printed with %#v floa...阅读全文

博文 2017-04-30 12:00:24 中柠檬

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

go int 和 []byte互相转化

1,Int2Byte 把int的每个字节取出来放入byte数组中,存储采用Littledian2,Byte2Int 把byte Slice 中的每个字节取出来, 按Littledian端拼成一个intfunc Int2Byte(data int)(ret []byte){ var len uintptr = unsafe.Sizeof(data) ret = make([]byte, len) var tmp int = 0xff var index uint = 0 for index=0; index>(index*8)) } return ret } func ...阅读全文

博文 2017-08-06 03:59:04 jinjiashan

快速排序

// 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 02:45:29 hrenlo

Validator

https://github.com/smartwalle/validator ## Validator 这是一个用 Golang 写的数据验证组件,主要用于验证 Struct 的属性是否满足特定的规范。 Golang 已经存在很多类似的第三方组件,但是总感觉使用起来不够灵活,尤其是在开发 API 接口的应用程序中,如果数据验证错误,需要返回一个 code 和 message 字段。[Validator](https://github.com/smartwalle/going/tree/master/validator) 这是我之前写的一个,使用起来总觉得不方便。 新版本的 Validator 将数据验证的权限完全将由者处理,开发者为每一个需要验证的属性写相关的验证方法,...阅读全文

[转载][翻译]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]

Golang作为一个略古怪而新的语言,有自己一套特色和哲学。从其他语言转来的开发者在刚接触到的时候往往大吃苦头,我也不例外。这篇文章很细致地介绍了Golang的一些常见坑点,读完全篇中枪好多次。故将其转载。由于文章很长,分为上下两部分,第一部分记录初级篇,第二部分记录进阶和高级篇:此为第二部分,若要看第一部分,请转至这里 感谢原文作者Kyle Quest以及翻译者影风LEY。出处见下: 原文链接:http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/ 译文链接:http://www.shwley.com/index.php/archives/80/以及http://www.shwley.com/index...阅读全文

博文 2017-06-10 00:00:02 Eilen

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 15:23:00 woodane

深入理解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的语法和数组很像,只是没有固定长度而已。...阅读全文

用Go替代mapreduce来处理大数据

This is one of those software engineering ideas that I would normally warn you about. So many people use MapReduce that it seems foolhardy to use something else. But in this case, it turned out well. The project was a success, and we were able to accomplish our goals more quickly and with fewer resources than it would have taken with a MapReduce cl...阅读全文

博文 2017-05-26 06:00:31 徐学良

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

Golang数组Array和切片slice使用

数组 数组在go语言中为值类型 数组之间可以用= =或!=比较,但是数组长度也是类型的一部分,因此不同长度的数组为不同的类型,如下,这是两个不同类型,因为数组长度不一样,不能用==或!=比较= = 下面ap和at数组是不同类型 ap:=[5]int{3:2}//下标3的值赋值为2 at:=[6]int{} 数组遍历 //数组遍历,i是数组当前下标,p是当前下标对应的值,i可以用_下划线代替,表示忽略 as := [3]int{1, 2, 3} for i, p := range as { f.Println(i, "---", p) pa[i] = &as[i] } //还可以常用的遍历循环 le:=len(as) for i:=0;i阅读全文

博文 2017-09-30 09:35:17 Link_Biao

golang基础--func函数

函数function Go函数不支持 嵌套, 重载和默认参数 支持以下特性: 无须声明原型,不定长度长度变参,多返回值,命名返回值参数,匿名函数,闭包 定义函数使用关键字func,且左侧大括号不能另起一行 package main import ( "fmt" ) func main() { a, b := 1, 2 D(a, b) //传递可变长度变量,无法修改slice索引,无法根本改变slice值 s1 := []int{1, 2, 3} D1(s1) //传递slice作为参数,修改索引值可以达到修改原始slice的效果 x := 1 D2(&x) //传递x的内存地址 } //参数返回值 func A(a int, b string) int { return a } //多个返回...阅读全文

博文 2018-07-12 13:30:14 failymao