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

学习Golang语言(5):类型--数组

学习Golang语言(5):类型--数组 --- 之前的章节我们学习了Golang的基本数据类型。接下来我们要学习Golang内置的高级类型:数组、切片和字典。 **数组(array)** Go语言的数组是一个定长的序列,数组包含的元素的类型相同。多维数组可以简单的使用自身为数组的元素来创建。 数组的元素使用操作符[]来索引,索引号从0开始。因此数组第一个元素为:array[0],最后一个元素为array[len(array)-1]。数组是可以更改的,可以使用array[index]放在赋值操作符左侧完成设置index位置的元素内容。 数组使用以下语法创建: ``` [length]type; [N]type(value1,value...阅读全文

如何避开 Go 中的各种陷阱 [译]

Go 语言有一些我们常说的「坑」,有不少优秀的文章解释讨论过这些「坑」。这些文章所讨论的东西非常重要,尤其对 Go 的初学者来说,时不时就有人掉进这些小「坑」里。 但有个问题让我困惑了很久,为什么我几乎没碰到过这些文章里讨论的绝大部分「坑」?真的,大多数比较知名的比如 “nil interface” 或者 “slice append” 等我从来就没觉得困惑过。我从开始使用 Go 一直到现在总是以某种方式避开了这些形形色色的问题。 后来发现,我足够幸运的读了不少解释 Go 数据结构内部实现的文章并且学习了一些 Go 内部运行原理的基础知识。这些知识足够让我对 Go 有了深刻的认识,同时也避免了掉进各种各样的坑里。 记住维基百科的定义,「坑 是…有效的构造…但同时是反直觉的」 所以,你只有两个选...阅读全文

博文 2016-11-23 06:27:19 newt0n

实现有序map之go

Go Map介绍 Go 中 Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用链式hash表来实现的。 c++中的实现 在C++ STL 中map 采用红黑树实现,可以实现有序的Map. Go 中实现 实现原理 这个实现方法的主要的方法是用空间换取时间。通过list 和 map 两种数据结构,保存相同的一份数据。list 用来做顺序遍历,map 用来做查找,删除操作 实现代码 package main import ( "container/list" "fmt" ) type Keyer interface...阅读全文

博文 2017-11-06 05:04:41 因心而来

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 小风吹的我乱了

在 Go 运行时中的 Strings

## 动机(Motivation) 可以认为这是对 [Rob Pike](https://ai.google/research/people/r) 的一篇关于 Go 字符串的[博客](https://blog.golang.org/strings)的解释。以 Go 程序员的思维来写。 在博客文章中,他说没有什么证据可以证明 Go 字符串是以 slices 的方式实现。我猜这不是他的疏忽,但起码可以证明一点,这不是这篇博客的核心。再说,任何想要自己研究的都可以在使用 Go 代码的过程中探索。我就是这样做的。所以在这篇文章中,我尽力解释 Go 字符串实现与 slice 实现的关系。 这里不讨论字符串编码。这不是在 runtime 中我想要探索的东西。但我模仿 slice 的常见字符串操作,如字符...阅读全文

博文 2018-10-13 23:04:08 gogeof

Go 切片 引用类型说明

今天看了无闻的GO 变成基础,看到了切片为引用类型的说明, 写代码实验了一下 var slice1 []int = make([]int, 4, 6) var slice2 []int = slice1 fmt.Println(slice1, slice2) // 输出内容 [0 0 0] [0 0 0] ////操作slice1 & slice2 看看是否会互相 影响 slice1[1] = 11 slice2[2] = 22 slice1 = append(slice1, 33) fmt.Println(slice1, slice2) // 输出结果 [0 11 22 0 33] [0 11 22 0] slice2 = append(slice2, 44) // fmt.Println...阅读全文

博文 2016-02-13 01:00:07 dhljs

unsafe.Pointer 和系统调用

按照 Go 语言官方文档所说, unsafe 是关注 Go 程序操作类型安全的包。 像包名暗示的一样,使用它要格外小心; unsafe 可以特别危险,但它也可以特别有效。例如,当处理系统调用时,Go 的结构体必须和 C 的结构体拥有相同的内存结构,这时你可能除了使用 unsafe 以外,别无选择。 unsafe.Pointer 可以让你无视 Go 的类型系统,完成任何类型与内建的 uintptr 类型之间的转化。根据文档,unsafe.Pointer 可以实现四种其他类型不能的操作: * 任何类型的指针都可以转化为一个 unsafe.Pointer * 一个 unsafe.Pointer 可以转化成任何类型的指针 * 一个 uintptr 可以转化成一个 unsafe.Poin...阅读全文

博文 2018-02-13 22:17:48 polaris

Golang升级到1.7后,之前正确的函数出现错误,分析原因及解决办法

最近尝试把开发环境,升级到Golang1.7.1后,程序会偶发性的宕掉,查看日志后,发现总是在一个计算切片的哈希值的地方,错误信息是: unexpected fault address 0xc043df4000, fatal error: fault 在1.7之前程序持续运行2年了,从来没有出现这个问题,怀疑是Golang编译器升级到SSA后导致的。将程序的代码精简为以下函数: //本代码的主要作用是,把一个字符串的Assii的值累加起来。 func SimpleCrc(ptr uintptr, size int) int { ret := 0 maxPtr := ptr + uintptr(size) for ptr < maxPtr { b := *(*byte)(unsafe.Poin...阅读全文

博文 2017-02-07 03:35:40 GoWKH

Golang 持久化

持久化 程序可以定义为算法+数据。算法是我们的代码逻辑,代码逻辑处理数据。数据的存在形式并不单一,可以存在数据库,文件。无论存在什么地方,处理数据的时候都需要把数据读入内存。如果直接存在内存中,不就可以可以直接读了么?的确,数据可以存在内存中。涉及数据存储的的过程称之为持久化。下面golang中的数据持久化做简单的介绍。主要包括内存存储,文件存储和数据库存储。 内存存储 所谓内存存储,即定义一些数据结构,数组切片,图或者其他自定义结构,把需要持久化的数据存储在这些数据结构中。使用数据的时候可以直接操作这些结构。 type Post struct { Id int Content string Author string } var PostById map[int]*Post var Pos...阅读全文

博文 2017-03-23 06:59:18 人世间

golang fmt占位符

golang fmt格式“占位符” qing123 · 2015-03-21 03:00:01 · 43307 次点击 · 预计阅读时间 2 分钟 · 大约1分钟之前 开始浏览 这是一个创建于 2015-03-21 03:00:01 的文章,其中的信息可能已经有所发展或是发生改变。 golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。 定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式。 Printf("%v", people) {zhangsan}, %+v 打印结构体时,会添加字段...阅读全文

博文 2018-07-14 18:30:00 Csir

空结构体struct{}解析

本篇文章转自David的"The empty struct"一文,原文地址链接是http://dave.cheney.net/2014/03/25/the-empty-struct 。欢迎大家访问[我的博客](http://zuozuohao.github.io/),代码可以在[@Zuozuohao](https://github.com/Zuozuohao/GolangGOFPatterns)下载。 **Introduction** 这篇文章详细介绍了我最喜欢的Go数据类型,空结构体--struct{}。 空结构体是没有位段的结构体,以下是空结构体的一些例子: ``` type Q struct{} var q struct{} ``` 但是如果一个就结...阅读全文

Go语言很好很强大,但我有几个问题想吐槽

作者 | Ben Boyter 译者 | 老夫子 Go 是一门非常不错的编程语言,并且逐渐取代 Python 成为很多人的首选语言。但它也有一些缺点让很多开发者忍不住吐槽,比如它在函数式编程、通道 / 并行切片处理、内存垃圾回收、错误处理等方面都有一些问题。本文作者将 Go 存在的“硬伤”设计记录了下来,与大家分享、讨论。 Go 是一门非常不错的编程语言。然而,我在公司的 Slack 编程频道中对 Go 的抱怨却越来越多(猜到我是做啥了的吧?),因此我认为有必要把这些吐槽写下来并放在这里,这样当人们问我抱怨什么时,我给他们一个链接就行了。先声明一下,在过去的一年里,我大量地使用 Go 语言开发命令行应用程序、scc、lc 和 API。 其中既有供客户端调用的大规模 API,也有即将在 htt...阅读全文

博文 2019-04-09 14:43:28 InfoQ

Golang之interface(多态,类型断言)

多态用法 package main //一种事物的多种形态,都可以按照统一的接口进行操作 //多态 import ( "fmt" "math/rand" "sort" ) type Student struct { Name string Id string Age int sortType int } type Book struct { Name string Author string } //切片默认传地址 type StudentArray []Student func (p StudentArray) Len() int { return len(p) } func (p StudentArray) Less(i, j int) bool { return p[i].Name <...阅读全文

博文 2018-01-15 07:30:01 pyyu

崩溃 golang入坑系列

早上(11.30)收到邮件,Vultr东京机房网络故障。当时搭建SS时,考虑到了机房故障。所以特意分出了日本和香港两条线路。但千算万算,忘记数据库还在东京机房中。 现在网络故障,SS服务器无法读取数据库中的账号信息。于是乎,主备两条线同时宕了。哭笑两声,没钱去做异地双活,访问量又不大,就这么凑合吧。 我就不信Vultr网络故障是大概率事件。如果很频繁的出故障,用户会用脚去投票的。 铁路警察各管一段,Vultr的故障让Vultr的运维去背锅吧。我们言归正传,继续聊Golang。 在<撸袖子>那节,我们提到了数组。 其中用了一个很少的篇幅说了一下数组的近亲-切片。当时说到数组使用起来不方便,Golang提供了一种更方便的数组使用方式,就是切片。这节中,我们就先来说切片。 先来复习数组的概念,就是...阅读全文

博文 2017-12-04 15:00:01 vikings-blog

来自老司机golang面试官的经验分享:面试你很大几率会遇到的go语言面试题

正在准备golang面试的小伙伴,很荣幸,你能看到这篇文章,希望每一个看到这篇分享的小伙伴都能找到自己称心如意的工作!​ 编程语言类:Go是什么?使用Go编程有什么好处?Go支持类型继承吗?Go支持运营商超载吗?Go支持方法重载吗?Go支持指针算术吗?Go支持通用编程吗?Go是一个区分大小写的语言吗?Go中变量的静态类型声明是什么?Go中变量的动态类型声明是什么?你能在Go中的单个声明中声明多种类型的变量吗?如何在Go中打印变量的类型?什么是指针?break语句的目的是什么?继续声明的目的是什么?goto语句的目的是什么?解释'for'循环的语法。解释在Go中创建函数的语法。你能从函数中返回多个值吗?您可以将参数传递给方法的方式有多少?将参数传递给函数的默认方式是什么?Go中的函数作为值是什...阅读全文

博文 2019-04-10 23:34:41 QFdongdong

指针与引用的区别

指针与引用的区别。由new生成的指针指向了特定的内存,它是不变的。而由make生成的内存块大小是可变的,当切片的增长超出了cap指定的大小时,将会重新分配一块更大的内存并将原切片内容复制过去,切片指向了新的内存块,切片原来的内存将会释放并回收。所以切片指向的内存地址是会变的。如果这一切还象指针那样由程序员来管理,难度是很大的。好在GO语言中这一切由系统来自动管理,程序员使用切片的名字来引用特定的内容,而不需要知道它们变动到了实际内存的哪块位置。引用的实质是用名字操作代替了指针操作,从而屏蔽与简化了这背后的指针操作复杂性...阅读全文

Go bufio包

Go bufio包 Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer object, creating another object (Reader or Writer) that also implements the interface but provides buffering and some help for textual I/O. bufio.Reader结构体 // Reader implements buffering for an io.Reader object. type Reader struct { buf []byte rd io.Reader // reader...阅读全文

博文 2017-02-10 12:00:28 xxggy

golang中不定参数与数组切片的区别

package main import "fmt" func main() { myfunc1(88, 42, 12, 56) //传递不定数量的参数 myfunc2([]int{88, 42, 12, 56}) //传递一个数组切片 } func myfunc1(args ...int) { //接受不定数量的参数,这些参数的类型全部是int for _, arg := range args { fmt.Println(arg) } } func myfunc2(args []int) { //传递一个数组切片 for _, arg := range args { fmt.Println(arg) } } 参考资料: 《Go语言编程》 2.5.3 不定参...阅读全文

博文 2016-02-23 03:00:00 leo8

Go 语言中 append 导致内存不足

这是一篇简短的笔记,关于你或许会遇上的 Go 语言的内存不足的问题。 如你所知,Go 语言的 slice 很强大且使用简单。通过 Go 语言的内置函数,它可以解决我们许多问题。 但是今天,我更多想讲述的是 slice 与它的内存。 首先,创建 slice 最简单的方式是: ```go var sliceOfInt []int var sliceOfString []int var sliceOfUser []User var sliceOfMap []map[string]int letters := []string{"a", "b", "c", "d"} numbers := []string{1, 2, 3, 4, 5} numbers := []User{ User{ Name: "...阅读全文

博文 2018-05-10 21:23:46 lightfish-zhang

Go 语言在命令行以表格的形式输出结构体切片

刚写的小工具,可以在命令行以表格的形式输出结构体切片 * 表格每列自动对齐 * 支持自动适应列宽 * 结构体的字段支持所有数据类型(字符串,切片,映射等) 例如可以很方便清晰地将数据库查询结果列表(结构体切片)在命令行以表格的形式输出。 项目 Github 主页: 对你有用的话,给个 star 支持一下吧~ ```go package main import ( "fmt" "github.com/modood/table" ) type House struct { Name string Sigil string Motto strin...阅读全文

Go语言:MD5加密

Golang的加密库都放在crypto目录下,其中MD5库在crypto/md5包中,该包主要提供了New()和Sum()函数。 package main import ( "crypto/md5" "encoding/hex" "fmt" ) func main() { data := []byte("Mdroid.cn") md5Ctx := md5.New() md5Ctx.Write(data) cipherStr := md5Ctx.Sum(nil) fmt.Println(cipherStr) fmt.Printf("%x\n", md5.Sum(data)) fmt.Printf("%x\n", cipherStr) fmt.Println(hex.EncodeToString...阅读全文

博文 2017-08-27 16:34:54 Mdroid

go切片

本文实例讲述了GO语言数组和切片的用法。分享给大家供大家参考。具体分析如下: 一、数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列。 (1)数组的创建。 数组有3种创建方式:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} 如下: 复制代码 代码如下: func test5() { var iarray1 [5]int32 var iarray2 [5]int32 = [5]int32{1, 2, 3, 4, 5} iarray3 := [5]int32{1, 2, 3, 4, 5} iarray4 := [5]int32{6, 7,...阅读全文

博文 2016-06-29 02:00:03 zhangym

go的学习记录(二)--- 数组与数组切片

在go语言的学习中,少不了接触的就是数组和数组切片,并且这两者的使用也是非常频繁的。因此如果不能进行很好的理解,或许很容易犯错。那么在go中,数组和数组切片都有什么特点,又是怎么声明赋值的,如何使用的呢,下面我就自己的理解总结一下,个人总结可能不全或者有错,望指点。 一、数组和数组切片的特点 数组是什么就不用多说了,作为开发者,这是经常会用到的东西,相信大家都有自己的理解。现在先总结一下数组的特点 1. 数组的长度在定义之后就不可被更改 2. 数组声明时的长度必须为常量或常量表达式,即可以在编译器确定长度,分配内存 3. 数组的下标从0开始,最后一个元素的下标为(长度-1),即在go中可以写为 len(arr)-1 4. go语言的数组是值类型,在作为参数传递时会做数组的复制操作。因此作为参...阅读全文

博文 2016-01-27 13:00:00 haust_wang

golang使用slice中遇到的坑

package main import ( "fmt" ) func sliceFunc(i []int, num int) []int { for j := 0; j < num; j++ { i = append(i, 3) } i[0] = num return i } func main() { s := make([]int, 0, 3) s = append(s, 1) fmt.Printf("cap=%d\ts=%v\n",cap(s),s) fmt.Println("=========") s1 := sliceFunc(s, 2) fmt.Printf("cap=%d\ts=%v\n",cap(s),s) fmt.Printf("cap=%d\ts1=%v\n",cap(s...阅读全文

博文 2016-08-30 16:00:00 52zjj

Go语言学习之路(五)输入和输出

输出语句 1.输出方法 fmt.Println()//换行输出 fmt.Print()//不换行输出 fmt.Printf() 2.输入方法 数据间隔只能使用回车 数据间隔可以使用空格和回车 fmt输入输出(printf和scanf采用的数据类型格式化) Scan()函数和Scanf()方法关于字符型变量的问题: var a byte fmt.Scan(&a) fmt.Printf("%c",a) Scan接收字符型变量时只接收整型 并通过ASCII码值转换为字符型 var a byte fmt.Scanf("%d",&a) fmt.Printf("%c",a) Scanf %d只能接收整型,不能接收字符型 所以在输入字符型变量时应该使用fmt.Scanf(“%c”,&a) 格式 含义 %%...阅读全文

博文 2018-12-17 00:31:01 weixin_39640179

go语言中数组和切片的区别 本人新手 高手勿喷

首先从定义中来区别 数组的概念就唠叨了 ,格式如下var balance [10] float32 第一个var是赋值符号 balance为数组名称 【10】为数组下表 float32 数组类型为浮点型 以上是数组的基本概念 重点在下面: var balance = []float32{1000.0, 2.0, 3.4, 7.0, 50.0},【】中不填写数字的形式,go语言中会根据元素的个数来设置数组的大小。或许会认为是动态数组 但是它不是 因为它的数量只是后面的元素来设定,但不是动态的 有什么区别 往下看: 切片的定义:代号(slice) go数组长度不可改变 上面没有数组下表的格式 是根据元素决定数组的大小 是设置 不是改变。而切片不同,与数组相比切片...阅读全文

【时速云线上分享】第十一期:Radio Dream流媒体直播平台基于Docker的应用

以下整理自第十一期技术分享内容,由 时速云 史鑫磊 分享。 首先介绍一下背景,Radio Dream项目是一个开源项目,前身为五雷轰顶网络电台,这个项目是我个人逐渐打磨了将近两年,最开始是因为猫扑网络电台停播,我个人是猫扑电台的老听众,很舍不得这个平台,后来想想,干脆自己做一个网络电台,就是因为这些想法催生了这个项目的成立。 说完背景开始聊聊这个电台的架构,我们从流媒体协议选型到架构实现等多个方面拆分的讲解这个平台实现方法,另外时速云镜像仓库里Radio Dream的镜像demo,总体来说这套系统部署起来还是十分复杂,虽然对系统要求极其低,单核心CPU,128M内存,20GB左右的硬盘就能跑起来,但是从最开始的架构设计我就打算做成一个集群化的方案,方便动态扩容,服务更多用户,...阅读全文

我的Golang全接触

满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来说, 简直是菜鸟级别的经验 但作为新生代语言的特点就是实战. Golang这一年里, 已经为项目提供了稳定的服务器和强大的扩展能力, 与客户端的Unity3D里的C#一样, 都是强大, 极致开发效率代表的优秀开发语言. 用途篇 Golang到底拿来做啥? 我需要么? 高效(性能,开发)的服务器语言. 包括Web, 游戏, App 编写桌面级UI暂不是很适合 我需要把现在的C++, Python, Erlang等服务器改成Golang么? 性能有瓶颈, 开发效率低, 有钱有时间的话, 完全可以 评价篇 听过太多的人对Golang的评价, 大概分为这么几类: C/C++性能党...阅读全文

博文 2016-11-15 05:00:06 CoderQ

go 速学 - 07 - Slice

目录 切片 Slice 概念 创建 Slice 定义切片 指定范围创建切片 使用 make 创建切片 len和 cap 遍历 Reslice Append 概念 使用 Copy 摘要 切片和数组的区别,创建切片,指定范围,make,遍历,reslice,append,copy 切片 Slice 概念 切片本身不是数组,而是指向底层的数组,关联数组的局部或全部 切片是引用类型 创建切片时索引不能超过数组的大小,否则会报异常 创建 Slice 定义切片 定义时不用指定长度(指定长度或使用 “…” 表示的是数组) //切片 var s []int fmt.Println(s) //[] //数组 var arr [5]int fmt.Println(arr) //[0 0 0 0 0] 指定范围创...阅读全文

博文 2015-05-06 23:00:15 mrseasons

为什么go语言还没有火起来?go语言有哪些劣势?

Go 是一门非常不错的编程语言,并且逐渐取代 Python 成为很多人的首选语言。但它也有一些缺点让很多开发者忍不住吐槽,比如它在函数式编程、通道 / 并行切片处理、内存垃圾回收、错误处理等方面都有一些问题。本文作者将 Go 存在的“硬伤”设计记录了下来,与大家分享、讨论。Go 是一门非常不错的编程语言。然而,我在公司的 Slack 编程频道中对 Go 的抱怨却越来越多(猜到我是做啥了的吧?),因此我认为有必要把这些吐槽写下来并放在这里,这样当人们问我抱怨什么时,我给他们一个链接就行了。 先声明一下,在过去的一年里,我大量地使用 Go 语言开发命令行应用程序、scc、lc 和 API。 其中既有供客户端调用的大规模 API,也有即将在 https://searchcode.com/ 使用的 ...阅读全文

博文 2019-04-11 19:34:42 QFdongdong

go语言细节

数组与字符串为值类型,切片、映射、通道为值类型,赋值需注意。 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 //数组 9 a1 := [3]int{1, 2, 3} 10 a2 := a1 11 a2[0] = 2 12 fmt.Println(a1) //print: 1 2 3 13 fmt.Println(a2) //print: 2 2 3 14 // 字符串 15 s1 := "123" 16 s2 := s1 17 s2 = "223" 18 fmt.Println(s1) //print 123 19 fmt.Println(s2) //print 223 20 // 切片 21 slice1 := []...阅读全文

博文 2015-11-24 03:00:00 --xiaoyao--

Go的可比性

package main import "fmt" type Album struct { music []string } func main() { a1 := Album{music: []string{"music", "music2"}} a2 := Album{music: []string{"music", "music2"}} fmt.Println(a1 == a2) } 上面这段程序无法编译,报错: invalid operation: a1 == a2 (struct containing []string cannot be compared) 是因为结构体内的切片不具有比较性。 切片类型、字典类型、函数类型的值是不具有可比性的...阅读全文

博文 2015-01-24 17:00:11 itfanr

golang字符串拼接与性能分析

字符串拼接在golang中是非常常见的操作,本文介绍几种常用方法并分析各种方法的效率. 拼接 + 号拼接 + 号拼接是最常见的方式 var a string = "Hello," var b string = "World!" func Test1() string { return a + b } buffer拼接 bytes 库提供一个结构体 Buffer, Buffer结构允许多次写入[]byte 、string 、rune类型的数据并一次性输出 var a string = "Hello," var b string = "World!" func Test2() string { var buffer bytes.Buffer buffer.WriteString(a) buffe...阅读全文

博文 2018-11-16 00:34:38 我傻笑你跑掉

golang slice 创建

slice 的创建有两种方法test := []int{2,3}或者是使用make,而且通常我们使用 make创建的情况比较多例如: test := make([]int, 5, 5) // 创建一个类型为 int,长度为 5,容量为 5 的切片 fmt.Println(len(test), cap(test)) // 5 5 test1 := make([]int, 3) //如果不指定容量,默认容量等于初始时的长度 fmt.Println(len(test1),cap(test1)) // 3 3 slice 的长度和容量可以自己是可以动态改变的, slice 其实是数组的某一部分 test := make([]int,0) // 创建一个长度为0,容量为0 的数组 fmt.Printl...阅读全文

博文 2017-09-04 06:04:59 beiciye

学习for循环的小问题,恳请老师指点一下

```go 1:sum := 0 2:for i := 0; i < 10; i++ { 3:sum += i 4:} //这行以上好理解,我能懂 5:list := []string{"aaa", "bbb", "ccc"} //请问1,这里list的值是切片么?好像不是数组。 6:for _,v := range list{ //请问2,这_,与range配合起到啥作用?这个程序好像是死循环啊 7:fmt.Print("%s", v) 8:} //(右边是原文注释)这里使用了一个range,key和value分别是int和string类型,key是序号,从0开始,value是值 ``` 这是我学习时遇到的一个例子注释是我的疑问。请路过的老师扶一把,谢谢...阅读全文

Go 中不定长度集合

如果你在使用像 C# 或 Java 这样的编程语言后来到 go,你发现的第一件事就是没有像 `List` 和 `Dictionary` 这样的传统集合类型。 这真让我困惑了好几个月。 我找到了一个名为 `container/list` 的软件包,并且几乎用它做所有的东西。 我脑后一直有一个声音在唠叨。语言设计者不应该不直接支持对未知长度的集合管理的功能。每个人都在讨论切片是如何在语言中被广泛使用,但我只是在有明确定义的容量或者它们通过函数返回时我才使用切片,这有点不对劲!! 因此,我在本月早些时候写了一篇文章,揭开了切片的盖子,希望能找到一些我不知道的魔法。我现在知道切片是如何工作的,但最终我仍然需要一个不断进行长度增长的数组。我在学校学过,使用链表更有效率,是存储大量数据更好的方法。特别是...阅读全文

博文 2018-08-11 22:55:10 polaris

Go 学习之路:引用类型与值类型

Golang中只有三种引用类型:slice(切片)、map(字典)、channel(管道); 引用类型 引用类型理解为(C语言):指针 值类型 值的拷贝 下面以值类型和slice(切片)例子可知: package main import "fmt" func main(){ a := [5]int{2, 3, 4, 5, 6} b := a fmt.Println(a,b) b[2] = 77 fmt.Println(a,b) } 上面定义了一个数组a,它是值类型,复制给b是copy,当b发生变化后a并不会发生任何变化,结果如下: 值类型 package main import "fmt" func main(){ a := []int{2, 3, 4, 5, 6} b := a fmt.P...阅读全文

博文 2018-06-28 18:34:42 fudomine

再谈CGO!

最近在kubernetes上搞集成其它team算法的事情,他们的算法是用c写的,自然地我需要用cgo去调用。本文整理了使用cgo过程中的一些函数,特此整理下来,记录。 1,给c函数传递二维整型数组 c函数需要接收一个二维整型数组作为参数, extern bool xxx_func(int** _matrix); 最初实现如下: goArray := [][]int{{1},{3,3},{3,3,2}} cArray := make([][]C.int, len(goArray)) for i, _ := range goArray { cArray[i] = make([]C.int, len(goArray[i])) for j, _ := range goArray[i] { cArra...阅读全文

博文 2017-08-18 07:05:11 Mark_Zhang

Go中字符串的遍历

首先说一下go中的字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。 Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题不会再困扰程序员。 字符串一旦赋值了,字符串就不能修改了:在Go中字符串是不可变的。 下面介绍字符串的三种遍历方式,根据实际情况选择即可。 常规遍历方式: var str = "Hello world!" for i := 0; i < len(str); i++ { fmt.Printf("str[%d]=%c\n", i, str[i]) } 运行结果: image 该遍历方式==缺点==:遍历...阅读全文

博文 2018-07-16 20:34:48 波涛澎湃

Reflect-Go一分钟快速入门

## Reflect 本文侧重讲解reflect反射的实践应用,适合新手初窥门径。 ### reflect两个基本功能 - reflect.TypeOf() 动态获取输入数据的类型 - reflect.ValueOf() 动态获取输入数据的值 ```golang func TypeOf(i interface{}) Type func ValueOf(i interface{}) Value ``` 通过reflect.Type和reflect.Value支持的方法,可以对输入的动态数据进行解析。 那么了解reflect.Type和reflect.Value提供的方法尤为重要,因为比较多,此介绍放在文末。 ### reflect.Kind 在reflect.Type和reflect.Valu...阅读全文

博文 2020-01-10 16:49:39 tinson

Golang的文件处理方式-常见的读写姿势

Golang的文件处理方式-常见的读写姿势 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 在 Golang 语言中,文件使用指向 os.File 类型的指针来表示的,也叫做文件句柄。注意,标准输入 os.Stdin 和标准输出 os.Stdout ,他们的类型都是 *os.File 哟。在任何计算机设备中,文件是都是必须的对象,而在 Web编程中,文件的操作一直是 Web程序员经常遇到的问题,文件操作在 Web应用中是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作。 一.文件的读取姿势 1 歌曲:我有一只小毛驴 2 歌手:碧瑶 3 专辑:《瑶谣摇》 4 发行时间:2014-03-18 5 词:付林 6 曲:付林 7 歌词: 8 我有一只小毛驴 9 我从...阅读全文

博文 2017-11-08 06:00:01 yinzhengjie

实现类似php的array_column方法

``` func SliceColumn(structSlice []interface{}, key string) []interface{} { rt := reflect.TypeOf(structSlice) rv := reflect.ValueOf(structSlice) if rt.Kind() == reflect.Slice { //切片类型 var sliceColumn []interface{} elemt := rt.Elem() //获取切片元素类型 for i := 0; i < rv.Len(); i++ { inxv := rv.Index(i) if elemt.Kind() == reflect.Struct { for i := 0; i < el...阅读全文

博文 2017-12-21 08:15:18 fightingforbing

数组与切片的区别

A, 数组是固定长度的,所以在创建时要指明长度,而切片长度是可变的,创建时不用标明长度,比如: 数组: d1 := [...]int{1, 2, 3} 切片: d2 := []int{1,2,3} B, 数组的操作是传值的,有拷贝动作,切片的操作实质是指针操作。如下: a := [5]int{1, 2, 3, 4, 5} b := a b[1] = 0 c := []int{} c = a[:] c[2] = 9 fmt.Println(a) fmt.Println(b) fmt.Println(c) 结果: ...阅读全文

golang append方法,读文件(buff)

今天研究go的复制文件的时候,发现复制出来的文件总是比源文件大了些,程序如下 package main import ( "os" "log" "io" "fmt" ) func main() { file, err := os.Open("C:/Users/Desktop/123123.txt") // For read access. defer file.Close() if err != nil { log.Fatal(err.Error()) } chunks := make([]byte,1024) buff := make([]byte, 1024) for{ count, err := file.Read(buff) if err != nil && err != io.EO...阅读全文

博文 2017-05-19 09:00:20 程序羊

golang中对于调用mysql 存储过程的问题解决思路

研究了很久,发现mysql最流程的那个库(github.com/go-sql-driver/mysql)怎么都解决不了调用存储过程的问题,最后找到另外一个库github.com/ziutek/mymysql/mysql,问题终于得以解决。不过mymysql似乎也有个小问题,调用存储过程的时候,似乎不能先Prepare。 详见:https://github.com/yudeguang/mysql/blob/master/db.go#L424 /* 执行存储过程,传入一个切片的指针,结果被返回到该切片中; 暂不支持Prepare,需自行拼接SQL. 结构体字段顺序必须与查询列顺序一致. 函数只返回第一个结果集,如果想处理多个结果集,调用MySqlStru...阅读全文