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

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语言坑之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字符串截取笔记

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

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

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中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

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

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中用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 送你一碗大麦茶

对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

go-redis使用

``` package main import ( "fmt" "log" "math/rand" "sync" "time" "github.com/go-redis/redis" ) var redisdb *redis.Client var wg sync.WaitGroup func main() { wg.Add(1) go testRedisBase() wg.Wait() } func testRedisBase() { defer wg.Done() //连接服务器 redisdb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", // use default Addr Password: "", // no ...阅读全文

博文 2019-12-21 12:58:10 bytemode

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 printf 格式化输出

https://blog.csdn.net/qq_34777600/article/details/81266453 Printf 格式化输出 通用占位符: v 值的默认格式。 %+v 添加字段名(如结构体) %#v 相应值的Go语法表示 %T 相应值的类型的Go语法表示 %% 字面上的百分号,并非值的占位符 布尔值: %t true 或 false 整数值: %b 二进制表示 %c 相应Unicode码点所表示的字符 %d 十进制表示 %o 八进制表示 %q 单引号围绕的字符字面值,由Go语法安全地转义 %x 十六进制表示,字母形式为小写 a-f %X 十六进制表示,字母形式为大写 A-F %U Unicode格式:U+1234,等同于 "U+%04X" 浮点数及复数: %b 无小数部分的...阅读全文

博文 2019-05-09 12:34:53 DragWellGoHead

golang slice 遍历删除

在slice中遍历删除满足条件的项 如下示例为,在一个数字切片中,遍历删除6以下的,保留6以上的数字 package main import "fmt" /*slice 遍历删除示例*/ func main() { //定义一个数字切片 ageList := []int{1, 3, 7, 7, 8, 2, 5} //遍历删除6以下的 for i := 0; i < len(ageList); { if ageList[i] < 6 { ageList = append(ageList[:i], ageList[i+1:]...) } else { i++ } } fmt.Printf("after del:%v", ageList) } 输出 after del:[7 7 8...阅读全文

博文 2018-11-13 22:34:39 小风吹的我乱了

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语言的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 天唯

golang append

append属于内置函数,用于 slice 的元素添加操作。slice 在操作时需要注意:slice 底层指向一个数据,相当于一个 view。因此在做 append 操作时必须要注意当底层数组无法容纳新增元素时,append会分配一个更大数组来容纳 slice,从而导致 slice 指向的底层数组变化。观察以下代码: ia := [...]int{1,2,3,4,5} ia2 := ia[1:3] ia2 = append(ia2,6,7,8,9) fmt.Println(ia,ia2) 打印的结果为:[1 2 3 4 5] [2 3 6 7 8 9]因为原始的 ia 数组无法容纳之后的 6,7,8,9,因此append直接分配了一个新的底层数组。观察以下代码: ia := [...]int...阅读全文

博文 2018-07-02 12:35:05 sanerersan

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 人世间

Golang 中make与new 区别

Golang 中make与new 区别 转载:https://medium.com/d-d-mag/golang-%E7%AD%86%E8%A8%98-make-%E8%88%87-new-%E7%9A%84%E5%B7%AE%E5%88%A5-68b05c7ce016 在 golang 有兩個保留字 make 與 new,也是剛開始學習 golang 的時候容易搞混的地方,這邊做個簡單的筆記。 new new 可以用來初始化泛型,並且返回儲存位址。所以通常我們會用指標變數來接 new 過後的型別。特別要注意的是,new 會自動用 zeroed value 來初始化型別,也就是字串會是"",number 會是 0,channel, func, map, slice 等等則會是 nil。 因為...阅读全文

博文 2019-02-15 10:34:45 raincoffee

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判断slice中是否存在某个item

之前在项目中需要判断某个slice中是否包含某个元素,当时自己的做法是遍历slice中的每个元素,直到找到了该元素,否则返回false。 simple.pic 这种做法是最容易想到,也是最简单的。但是存在一个问题:就是只能对一种数据类型判断,比如上面代码中的int、[]int,如果需要判断其它类型,需要写一个同样的函数,只是参数类型不一样,这样的代码很明显,可用性太低。后来发现可以用反射规避这个问题,利用reflect包中的TypeOf()、ValueOf()和DeepEqual()接口,接口说明请参考文档。代码如下: reflect.pic 瞬间不用再为不同数据类型需要写不同函数而心烦了!注:参考blog,https://wxnacy.com/2018/11/20/go-in-array/...阅读全文

博文 2019-03-06 11:34:45 心中的日月Go

golang中的append函数详解

1. append函数是用来在slice末尾追加一个或者多个元素。 2. 当追加元素时,发现slice的**len>cap**时,会重新开辟一个**2*cap**的内存空间去存储追加过元素的slice。 3. 如果追加元素后slice的**len<=cap**,则append返回的新生成的slice的内存地址**依旧**是传入的slice参数的内存地址。 ```go testSlice := make([]int, 0) testSlice = append(testSlice, 0) fmt.Printf("len: %d, cap: %d, data:%+v \n", len(testSlice), cap(testSlice), testSlice) //len: 1, cap: 1,...阅读全文

博文 2018-11-12 14:56:01 lijingtian

Golang 数据结构:栈与队列

Golang 中栈、队列的实现及常用操作,数据结构系列原文:flaviocopes.com,翻译已获作者授权。 栈概述栈是数据按照后进先出 LIFO(Last-In-First-Out) 原则组成的集合。添加和移除元素都是在栈顶进行,类比书堆,不能在栈底增删元素。 栈的应用很广泛,比如网页跳转后一层层返回,ctrl+z 撤销操作等。 使用 slice 动态类型来实现栈,栈元素的类型是使用 genny 创建的通用类型 ItemStack,实现以下常用操作: 123New() // 生成栈的构造器Push() Pull() 代码实现1234567891011121314151617181920212223242526272829303132333435package stackimport ( ...阅读全文

博文 2018-03-15 10:59:03 wuYinBlog

golang 二维slice初始化

二维slice有多个一维slice元素组成,显然,每个元素的长度不必一致。 a := [][]float64{ {1, 2, 3, 4}, {12, 21, 3, 14}, {1, 1, 2, 3}, {2, 3, 1, 6}, {2, 2, 3, 3}, {1, 1, 1, 1}} 1、应有二维的类型, 2、大花括号下的每个小花括号后均有逗号,最后一个除外 3、最后的大花括号应与最后一个元素在一行,挨着最后的小花括号 a := [][4]float64{//限定4列 {1, 2, 3, 4}, {12, 21, 3, 14}, {1, 1, 2, 3,5},//5个数 {2, 3, 1, 6}, {2, 2, 3, 3}, {1, 1, 1, 1}} 编译会出错:out of bound...阅读全文

博文 2017-07-22 10:03:29 小白雕

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 for语句完全指南

以下所有观点都是个人愚见,有不同建议或补充的的欢迎emialaboutme 原文章地址 关于for语句的疑问 for语句的规范 for语句的内部实现-array 问题解答 关于for语句的疑问 我们都知道在golang中,循环语句只有for这一个,在代码中写一个循环都一般都需要用到for(当然你用goto也是可以的), 虽然golang的for语句很方便,但不少初学者一样对for语句持有不少疑问,如: for语句一共有多少种表达式格式? for语句中临时变量是怎么回事?(为什么有时遍历赋值后,所有的值都等于最后一个元素) range后面支持的数据类型有哪些? range string类型为何得到的是rune类型? 遍历slice的时候增加或删除数据会怎么样? 遍历map的时候增加或...阅读全文

博文 2018-01-16 13:44:39 sheepbao.github.io

golang--数据类型

A 基本数据类型 1 布尔类型 bool 1)Go 对于值之间的比较有非常严格的限制,只有两个类型相同的值才可以进行比较,如果值的类型是接口(interface),它们也必须都实现了相同的接口。如果其中一个值是常量,那么另外一个值的类型必须和该常量类型相兼容的。 2)对于布尔值的好的命名能够很好地提升代码的可读性,例如以 is 或者 Is 开头的isSorted 、 isFinished 、 isVisivle 。 3)在格式化输出时,你可以使用 %t 来表示你要输出的值为布尔型。 4)布尔型的值只可以是常量 true 或者 false。 2 数字类型 ##有符号整数 int8(-128 -> 127) int16(-32768 -> 32767) int32(-2,147,483,648 ...阅读全文

博文 2018-11-05 04:34:39 风再起时ME

Golang切片操作

开发十年,就只剩下这套Java开发体系了 >>> s1 := []int{1, 2, 3, 4, 5} //短操作符声明 len为4,cap为4 s2 := make([]int, 2, 4) //make语法声明 ,len为2,cap为4 s2 = []int{5, 6} s3 := append(s2, 7) //append一个元素 fmt.Println(s3, s2) //[5 6 7] [5 6] s4 := append(s2, s1...) //append 一个切片所有的元素 fmt.Println(s4) //[5 6 3 4] //return copy(s1, s2) // 复制,用s2的元素填充s1里去,改变原slice,覆盖对应的key fmt.Println(s...阅读全文

博文 2018-09-23 01:33:06 FalconChen

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

golang 模板(template)的常用基本语法

golang 模板(template)的常用基本语法 模板 在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页,golang提供了html/template包来支持模板渲染。 这篇文章不讨论golang后端的模板读取及渲染方法,只讨论模板中嵌入变量,渲染变量、循环等一些基本用法。 变量 在golang渲染template的时候,可以接受一个interface{}类型的变量,我们在模板文件中可以读取变量内的值并渲染到模板里。 有两个常用的传入参数的类型。一个是struct,在模板内可以读取该struct域的内容来进行渲染。还有一个是map[string]interface{},在模板内可以使用key来进行渲染。 我一般使用第二种,效率可能会差一...阅读全文

博文 2019-06-26 00:32:48 虚心的锄头

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 语言的指针切片

![Image courtesy — https://xkcd.com/138/](https://raw.githubusercontent.com/studygolang/gctt-images/master/uh-oh-is-in-go-slice-of-pointers/1.png) Go 让操作 Slice 和其他基本数据结构成为一件很简单的事情。对于来自 C/C++ 令人畏惧的指针世界的人来说,在大部分情况下使用 Golang 是一件令人幸福的事情。对于 **JS/Python** 的使用者来说,Golang 除了语法之外,没有什么区别。 然而,**JS/Pyhon** 的使用者或是 Go 的初学者总是遇到使用指针的时候。下面的场景就是他们可能会遇到的。 ## 场景 假设这样一个...阅读全文

博文 2018-07-12 23:13:17 magichan

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

Golang数组和切片的示例

写个小demo来看看通过生成切片append扩容后发生了什么 package main import ( "fmt" ) var ( //实例化一个长度容量为5的slice //从slice切出一个slice2 slice = make([]int, 5) slice2 = slice[2:] ) func main() { printSlice() //修改slice2第0个元素 slice2[0] = 1 printSlice() //扩容slice2 slice2 = append(slice2, 2) printSlice() //修改slice2第0个元素 slice2[0] = 3 printSlice() //修改slice第0个元素 slice[0] = 4 printSli...阅读全文

博文 2019-05-25 22:34:44 CappuccinoBx

Golang下的slice拼接

我们使用Python编程都知道,想要拼接两个list为一个list可以有很多方式,比如: # 方式1 : name = ["golang","python","shell"] user = ["xxb","biaoge"] alldata = name+user print(alldata) # 方式2: name = ["golang","python","shell"] user = ["xxb","biaoge"] name.extend(user) print(name) 在Golang中如何快速的拼接slice呢,其实有个很巧妙的方法: $ cat addslice.go package main import ( "fmt" ) func main() { name := []s...阅读全文

博文 2018-11-23 14:34:43 BGbiao

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

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

Go语言_range(范围)理解

一、Go语言中的range Go 语言中 range 关键字用于 for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素; 在数组和切片中它返回元素的索引值, 在集合中返回 key-value 对的 key 值。 二、代码举例 package main import "fmt" func main() { //这是我们使用range去求一个slice的和。使用数组跟这个很类似 nums := []int{2, 3, 4} sum := 0 for _, num := range nums { sum += num } fmt.Println("sum:", sum) //在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使...阅读全文

博文 2018-07-26 00:30:00 OctoptusLian

golang slice

#slice append 实现 s2 := append(s1, *) 切片s1上记录的切片信息复制给s2, 1.如果s1指向的底层array长度不够,append的过程会发生如下操作:内存中不仅新开辟一块区域存储append后的切片信息,而且需要新开辟一块区域存储底层array(复制原来的array至这块新array中),最后再append新数据进新array中,这样,s2指向新array。 2.如果s1指向的底层array长度够, s2和s1指向同一个array,append的结果是内存中新开辟一个区域存储新切片信息。 开辟一块区域存储底层array 使用下面的策略: 1.如果 增加的 len < s的cap 则 新s的cap*2 2.如果 增加的 len > s的cap 则 新s的c...阅读全文

博文 2017-09-21 09:33:13 1071954237

golang slice 排序

如下示例为,在一个Person切片中,按年龄大小进行排序 package main import ( "fmt" "sort" ) /*slice 排序示例*/ type Person struct { Age int } type PersonSlice []Person func (s PersonSlice) Len() int { return len(s) } func (s PersonSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s PersonSlice) Less(i, j int) bool { return s[i].Age < s[j].Age } func main() { persons := Pe...阅读全文

博文 2018-11-13 22:34:39 小风吹的我乱了

golang 查询数据库操作

SQL.Open only creates the DB object, but dies not open any connections to the database. If you want to test your connections you have to execute a query to force opening a connection. The common way for this is to call Ping() on your DB object. See http://golang.org/pkg/database/sql/#Open and http://golang.org/pkg/database/sql/#DB.Ping Quoting from...阅读全文

博文 2017-07-01 08:00:35 oxspirt

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中json的使用

golang中使用json,经常会使用到两个函数 func Unmarshal(data []byte, v interface{}) error 1 将json反序列化成struct对象 2将json 反序列化到map中 3 将json反序列化到slice中 func Marshal(v interface{}) ([]byte, error)1将struct对象序列化成json 2将map序列化成json 3将slice序列化成json package main import ( "fmt" "encoding/json" ) type User struct { Username string Password string FriendName []string } func mai...阅读全文

博文 2017-03-05 05:55:41 skh2015java

正确理解golang slice的复制

slice 三个属性 golang 的slice是一个指向底层的数组的指针结构体。 这个结构体有三个属性,1.指向数组指针,2.len: slice中元素的数量 3.cap:slice占用内存数量。 只有深刻理解这三个属性才能在使用slice中不至于犯错。 正确理解变量和共享 多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠 以上是golang 圣经中的一句话。深刻理解这句话对于日程编程非常有意义。 1.什么时候共享数据会被其他变量修改 func f1() { a1 := []int{1,2,3,4,5,6} a2 := a1 a3 := a1[1:3] a1[1] = 999 fmt.Println("a1=",a1,"a2=",a2,"a3=",a3) } 运行结果 ...阅读全文

(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

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

Golang 新手可能会踩的 50 个坑

译文:Golang 新手可能会踩的 50 个坑原文:50 Shades of Go: Traps, Gotchas, and Common Mistakes翻译已获作者授权,转载请注明来源。 不久前发现在知乎这篇质量很高的文章,打算加上自己的理解翻译一遍。文章分为三部分:初级篇 1-34,中级篇 35-50,高级篇 51-57 前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷。如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到。 如果花时间学习官方 doc、wiki、讨论邮件列表、 Rob Pike 的大量文章以及 Go 的源码,会发现这篇文章中的坑是很常见的,新手跳过这些坑,能减少大量调试代码的时间。 初级篇:1-...阅读全文

博文 2018-03-14 22:34:37 wuYin

go语言的比较运算

首先区分几个概念:变量可比较,可排序,可赋值 可赋值 规范里面对赋值是这么定义的:https://golang.org/ref/spec#Assignability A value x is assignable to a variable of type T ("x is assignable to T") in any of these cases: x's type is identical to T. x's type V and T have identical underlying types and at least one of V or T is not a defined type. T is an interface type and x implements T. x...阅读全文

博文 2017-10-11 18:34:47 CodeGeek

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 肖楠

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

golang map遍历

map 遍历 遍历的顺序是随机的 基本的遍历方式 func main() { m := map[string]int{ "a": 1, "b": 2, } for k, v := range m { fmt.Println(k, v) } } /* 可能的输出之一 a 1 b 2 */ /* 可能的输出之二 b 2 a 1 */ 遍历的时候元素的顺序是随机的,有可能先输出a,也有可能先输出b 在遍历中增加元素 在遍历的同时增加元素,增加的元素是可以被遍历到的 func main() { m := map[string]int{ "a": 1, "b": 2, } for k, v := range m { m["c"] = 3 fmt.Println(k, v) } } /* 输出 b 2 ...阅读全文