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

golang 使用 strings.Split 切割的注意

s := strings.Split("", "") fmt.Println(s, len(s)) s = strings.Split("abc,abc", "") fmt.Println(s, len(s)) s = strings.Split("", ",") fmt.Println(s, len(s)) s = strings.Split("abc,abc", ",") fmt.Println(s, len(s)) s = strings.Split("abc,abc", "|") fmt.Println(s, len(s)) fmt.Println(len("")) fmt.Println(len([]string{""})) str := "" fmt.Println(str[0]...阅读全文

博文 2014-10-04 19:27:43 984195889

golang 高效字符串拼接

以下内容摘自许世伟《go语言程序设计》: 连接字符串使用" + "或者使用slice拼接,"这2个转换都不是无代价的" 虽然方便,但是使用+=操作符并不是在一个循环中往字符串末尾追加字符串最有效的方式,一个有效的方式是准备好一个字符串切片([]string),然后使用strings.Join()函数一次性将所有字符串串联起来。但是在go中还有一个更好的方法,其原理类似于java中的stringBuilder package main import ( "bytes" "fmt" ) func main() { var buffer bytes.Buffer //Buffer是一个实现了读写方法的可变大小的字节缓冲 for { if piece, ok := getNextString(); ...阅读全文

博文 2015-06-17 20:04:00 u012210379

golang 中regexp包用法

本文转自Golove博客:http://www.cnblogs.com/golove/p/3270918.html regexp 包中的函数和方法 // regexp.go ------------------------------------------------------------ // 判断在 b 中能否找到正则表达式 pattern 所匹配的子串 // pattern:要查找的正则表达式 // b:要在其中进行查找的 []byte // matched:返回是否找到匹配项 // err:返回查找过程中遇到的任何错误 // 此函数通过调用 Regexp 的方法实现 func Match(pattern string, b []byte) (matched bool, err e...阅读全文

博文 2014-11-10 22:00:02 chenbaoke

go语言数据类型-数组(array)

1 go语言数组简介 数组是Go语言编程中最常用的数据结构之一。顾名思义,数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。 在Go语言中数组是一个值类型(value type)。是真真实实的数组,而不是一个指向数组内存起始位置的指针,也不能和同类型的指针进行转化,这一点严重不同于C语言。所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。如果将数组作为函数的参数类型,则在函数调用时该参数将发生数据复制。因此,在函数体中无法修改传入的数组的内容,因为函数内操作的只是所传入数组的一个副本。 2 数组定义 定义方式如下 var arr [n]type n表示数组长度,type表示数组存储类型。 在Go语言中,...阅读全文

博文 2014-10-10 14:00:00 JesseYoung

Go学习笔记之:range函数

range函数是个神奇而有趣的内置函数,你可以使用它来遍历数组,切片和字典。 当用于遍历数组和切片的时候,range函数返回索引和元素; 当用于遍历字典的时候,range函数返回字典的键和值。 package main import "fmt" func main() { // 这里我们使用range来计算一个切片的所有元素和 // 这种方法对数组也适用 nums := []int{2, 3, 4} sum := 0 for _, num := range nums { sum += num } fmt.Println("sum:", sum) // range 用来遍历数组和切片的时候返回索引和元素值 // 如果我们不要关心索引可以使用一个下划线(_)来忽略这个返回值 // 当然我们有的时...阅读全文

博文 2014-11-27 23:00:02 Goopand

Go的reflect机制和reflect包

Go的reflect机制和reflect包 概述 虽然Go是静态语言,然而还是提供了reflect机制,并且定义了reflect包来辅助反射处理。在reflect包中,最重要的两个类型就是Type和Value,分别从类型、值的角度来描述一个Go对象。 Type类型是一个接口,这个接口实现了String() string方法。Value类型是一个结构,但是并未定义任何导出字段,同样定义了String() string方法。 使用如下语句来导入reflect包 import "reflect" 注意: 1.本文中出现在类型章节的函数,都是Type的方法。由于接口的特殊性,无法明确其receiver是指针还是值,所以并未显示其receiver,但都是有receiver的 2.很多方法都有要求,如果...阅读全文

博文 2014-10-11 11:00:06 fighterlyt

Go 语言中的 new() 和 make()的区别

本文是看了文章之后的心得。 在此感谢。 概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 他们所做的事情,和应用的类型也不相同。 二者都是用来分配空间。 new 函数 new 是内建函数,函数原型为 func new(Type) *Type 官方文档描述为: The new build-in function allocates memory(仅仅分配空间). The first argument is a type, not a value, and the value returned is a pointer to a newly allocated zero value of that type. 翻译如下: ...阅读全文

博文 2015-06-17 20:06:02 xiaorenwuzyh

Go 系列教程 —— 6. 函数(Function)

这是我们 [Golang 系列教程](/subject/2)第 6 章,学习 Golang 函数的相关知识。 ## 函数是什么? 函数是一块执行特定任务的代码。一个函数是在输入源基础上,通过执行一系列的算法,生成预期的输出。 ## 函数的声明 在 Go 语言中,函数声明通用语法如下: ```go func functionname(parametername type) returntype { // 函数体(具体实现的功能) } ``` 函数的声明以关键词 `func` 开始,后面紧跟自定义的函数名 `functionname (函数名)`。函数的参数列表定义在 `(` 和 `)` 之间,返回值的类型则定义在之后的 `returntype (返回值类型)`处。声明一个参数的语法采用 **参...阅读全文

博文 2017-12-08 12:27:20 polaris

golang中io/ioutil包用法

本文转自Golove博客:http://www.cnblogs.com/golove/p/3278444.html ,并在此基础上进行添加修改. io/ioutil 包中的函数和方法 // ioutil.go ------------------------------------------------------------ // ReadAll 读取 r 中的所有数据 // 返回读取的数据和读取过程中遇到的任何错误 // 如果读取成功,则 err 返回 nil,而不是 EOF func ReadAll(r io.Reader) ([]byte, error) func main() { s := strings.NewReader("Hello World!") ra, _ := io...阅读全文

博文 2015-06-17 20:20:53 chenbaoke

Golang中使用set

Go中是不提供Set类型,Set是一个集合,set里的元素不能重复。 两种思路 2 basic set implementations 使用map实现 在Golang中通常使用map来实现set,map中的key为唯一值,这与set的特性一致。 简单实现,如下: set := make(map[string]bool) // New empty set set["Foo"] = true // Add for k := range set { // Loop fmt.Println(k) } delete(set, "Foo") // Delete size := len(set) // Size exists := set["Foo"] // Membership map的value值是布...阅读全文

博文 2020-03-26 07:32:40 DevilRoshan

Go interface详解

如Go method中提及,Golang没有明确支持多态,但是通过其他手段可以实现类似C++中的多态特性,即本文中即将介绍的Go interface功能。 interface定义   interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现。请注意:此处限定是一组方法,既然是方法,就不能是变量;而且是一组,表明可以有多个方法。再多声明一点,interface本质上是一种类型,确切的说,是指针类型,此处暂且不多表,后文中自然能体会到。   interface是为实现多态功能,多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值。 type 接口名称 inter...阅读全文

博文 2019-03-06 19:34:40 北春南秋

golang 内置函数new() 和struct{} 初始化的区别

new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针。 在golang的代码定义如下: func new(t Type) *Type strut{} 直接使用struct{} 来初始化strut时,返回的是一个struct类型的值,而不是指针两者是不一样的 两者对比代码如下: type Student struct{ id int name string } func main(){ var s_1 *Student = new(Student) s_1.id = 100 s_1.name = "cat" var s_2 Student = Student{id:1,name:"tom"} fmt.Println...阅读全文

博文 2015-06-17 20:03:41 happinessaflower

golang学习笔记:go 语法篇(一)

学习一门新的语言肯定是要从他的基本语法开始,语法构成了整个程序设计的基础,从语法中我们也可以看到这门语言的一些特性,但是话说回来,语法这东西,不同的语言大同小异,所以这也对语法的记忆造成了一定的难度,其实最好的方法应该是旁边有本书,随时可以拿过来查阅或者纠正。当然golang的语法也是这样,下面的一些是我学习七牛云存储团队许式伟等出的《Go语言编程》: http://baike.baidu.com/link?url=vFrjnVJwITN0LaRbL7TmWYpq5V8JLWzL_NycAQy6w0e7JXP6a4bGm61ge0gGMU6jNFQO_RnuDGEQPh7YK9w4S_ 语法部分的时候整理的一些,这本书对于新手入门还是挺有帮助的。为了日后可以及时回顾,所以记录下来了。为了避免...阅读全文

博文 2015-06-12 09:00:06 u011321908

Golang通过syscall调用windows dll方法

本用例在GO 1.4.2 上编译执行通过,直接上CODE: package main import ( "fmt" "syscall" "time" "unsafe" ) const ( MB_OK = 0x00000000 MB_OKCANCEL = 0x00000001 MB_ABORTRETRYIGNORE = 0x00000002 MB_YESNOCANCEL = 0x00000003 MB_YESNO = 0x00000004 MB_RETRYCANCEL = 0x00000005 MB_CANCELTRYCONTINUE = 0x00000006 MB_ICONHAND = 0x00000010 MB_ICONQUESTION = 0x00000020 MB_ICONEXCLAM...阅读全文

博文 2015-03-29 12:00:01 hotkit

golang反射中函数和方法的调用

golang反射中函数和方法的调用 上一篇文章说到了golang中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要谈的。 反射中调用函数 众所周知,golang中的函数是可以像普通的int、float等类型变量那样作为值的,例如: package main import "fmt" func hello() { fmt.Println("Hello world!") } func main() { hl := hello hl() } prints: hello world! 既然函数可以像普通的类型变量一样可以的话,那么在反射机制中就和不同的变量一样的,在反射中函数和方法的类型(Type)都是reflect.Func,如果要调用...阅读全文

博文 2014-10-06 10:08:32 wowzai

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

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

博文 2016-09-03 03:00:03 sryan

Go语言的defer,你真的懂了吗?

2013-04-25 Go语言的defer,你真的懂了吗? example1 func f() (result int) { defer func() { result++ }() return 0 } example2 func f() (r int) { t := 5 defer func() { t = t + 5 }() return t } example3 func f() (r int) { defer func(r int) { r = r + 5 }(r) return 1 } 先不要运行代码,自己在心里跑一遍结果,然后再去验证。如果三个都做对了并且不好蒙的...好吧,不用往下看了,你已经懂defer了。 额,如果example1中你算的是0,你就错了;如果example2...阅读全文

博文 2015-03-16 11:57:12 zenlife

golang对共享内存的操作

不同进程间的内存是互相独立的,没办法直接互相操作对方内的数据,而共享内存则是靠操作系统提供的内存映射机制,让不同进程的一块地址空间映射到同一个虚拟内存区域上,使不同的进程可以操作到一块共用的内存块。共享内存是效率最高的进程间通讯机制,因为数据不需要在内核和程序之间复制。 共享内存用到的是系统提供的mmap函数,它可以将一个文件映射到虚拟内存的一个区域中,程序使用指针引用这个区域,对这个内存区域的操作会被回写到文件上,其函数原型如下: void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定f...阅读全文

博文 2014-10-04 19:27:13 壬癸甲乙

基于go语言的消息推送系统架构分析

本系统是猎豹移动基于go语言开发的一套消息推送系统,源码地址:https://github.com/Terry-Mao/goim 一、架构图 二、功能简介 1.comet 长连接服务器,支持长轮训、tcp、websocket连接,有超时机制 2.logic 逻辑处理服务器,消息推送入口,通过userId在router服务器中查找对应的comet服务器,将serverId和消息一起保存到kafka队列,logic是无状态服务器,可以随意增删,因为comet需要连接logic,所以在comet服务器中需要连接logic的通过LVS的虚IP,LVS加了real server后不会断开,所以需要在comet服务触发SIGHUP,重新load配置文件。 3.router 路由服务器,保存userId和...阅读全文

博文 2015-10-24 19:00:05 qinyongbo

golang的defer精析

example1 func f() (result int) { defer func() { result++ }() return 0 } example2 func f() (r int) { t := 5 defer func() { t = t + 5 }() return t } example3 func f() (r int) { defer func(r int) { r = r + 5 }(r) return 1 } 先不要运行代码,自己在心里跑一遍结果。然后再去验证。如果三个都做对了并且不是蒙的....好吧,不用往下看了,你已经懂defer了。 多空几行确保你先在心里跑过一遍代码,之后验证了,并且存在疑惑...... 额,如果example1中你算的是0,你就错了 如果...阅读全文

博文 2014-10-04 19:27:12 chen yuwen

Golang中defer、return、返回值之间执行顺序的坑

Go语言中延迟函数defer充当着 cry...catch 的重任,使用起来也非常简便,然而在实际应用中,很多gopher并没有真正搞明白defer、return和返回值之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱! 先来运行下面两段代码: A. 无名返回值的情况 package main import ( "fmt" ) func main() { fmt.Println("return:", a()) // 打印结果为 return: 0 } func a() int { var i int defer func() { i++ fmt.Println("defer2:", i) // 打印结果为 defer: 2 }() defer func() { i++ fmt.Pr...阅读全文

博文 2015-09-13 16:00:00 henrylee2cn

go语言init和main函数

Go里面有两个保留的函数:init函数和main函数。下边就来比较一下两个函数的异同。 相同点:两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。 不同点:init可以应用于任意包中,且可以重复定义多个。main函数只能用于main包中,且只能定义一个。 下边说一下两个函数的执行顺序: 对同一个go文件的init()调用顺序是从上到下的 对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数,对于 对不同的package,如果不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init() 如果package存在依赖,则先调用最早被依赖的package中的init() 最后调用main函数 下图截自astaxie...阅读全文

博文 2015-06-17 23:02:22 Mervyn1205

golang如何执行脚本并获取返回值

golang中如何执行脚本并获取返回值 调用脚本 在golang标准库中提供了两种方式可以用来启动进程调用脚本 第一种是在os库中的Process类型,Process类型包含一系列方法用来启动进程并对进程进行操作(参考: https://golang.org/pkg/os/#Process) 第二种是在os/exec库种通过Cmd类型的各个函数实现对脚本的调用,实际上Cmd是对Process中各种方法的高层次封装(参考: https://golang.org/pkg/os/exec/) 示例 使用Process执行脚本 package main import ( "fmt" "os" ) func main() { shellPath := "/home/xx/test.sh" argv :...阅读全文

博文 2017-09-22 14:03:22 RichardFan

golang之http/FormValue踩坑记

今天下午在试 Weed-FS 的 Collection 特性的时候, 发现了一个关于 FormValue 返回结果不符合预期的 bug , 检查了一番, 才发现是因为没有正确使用导致的。 顺便为此提交了一个只包含一行代码 r.ParseForm() 的 PullRequest fix bug 。 真是【查bug千日,修bug一时】。。。 具体原因很简单,看下面这个示例代码就知道了: Bug 重现 package main import ( "net/http" ) func HelloServer1(w http.ResponseWriter, r *http.Request) { //r.ParseForm() val := r.FormValue("key") println("Hell...阅读全文

博文 2015-02-15 18:28:35 YanyiWu

Golang错误和异常处理的正确姿势

Golang错误和异常处理的正确姿势错误和异常是两个不同的概念,非常容易混淆。很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误。从表面上看,一切皆错误的思路更简单,而异常的引入仅仅增加了额外的复杂度。但事实并非如此。众所周知,Golang遵循“少即是多”的设计哲学,追求简洁优雅,就是说如果异常价值不大,就不会将异常加入到语言特性中。 错误和异常处理是程序的重要组成部分,我们先看看下面几个问题: 错误和异常如何区分? 错误处理的方式有哪几种? 什么时候需要使用异常终止程序? 什么时候需要捕获异常? ... 如果你对这几个问题的答案不是太清楚,那么就抽一点时间看看本文,或许能给你一些启发。 face-to-exception.p...阅读全文

博文 2017-11-28 14:00:01 zhangboyu

Go语言文档

Go语言文档 [Go语言中文小组] 翻译整理 2011-03-02 关于本文Go语言简介安装go环境 3.1. 简介3.2. 安装C语言工具3.3. 安装Mercurial3.4. 获取代码3.5. 安装Go3.6. 编写程序3.7. 进一步学习3.8. 更新go到新版本3.9. 社区资源3.10. 环境变量 Go语言入门 4.1. 简介4.2. Hello,世界4.3. 分号(Semicolons)4.4. 编译4.5. Echo4.6. 类型简介4.7. 申请内存4.8. 常量4.9. I/O包4.10. Rotting cats4.11. Sorting4.12. 打印输出4.13. 生成素数4.14. Multiplexing Effective Go 5.1. 简介 5.1.1. ...阅读全文

博文 2015-07-23 21:00:03 dazheng

Go语言中怎样判断数据类型_不懂的木匠_新浪博客

要判断数据类型,可以用Go的空接口: 建一个函数t 设置参数i 的类型为空接口,空接口可以接受任何数据类型 func t(i interface{}) { //函数t有一个参数i switch i.(type) { //多选语句switch case string: //是字符时做的事情 case int: //是整数时做的事情 } return } i.(type)只能在switch中使用 这函数没有返回值,你可以自己加入 ---------------------------------------------------------------------------- 还可以用反射: package main import ( "fmt" "reflect" ) func main(...阅读全文

博文 2015-09-22 03:00:01 ftm-datablogs

Go Reflect

最近在看一些go语言标准库以及第三方库的源码时,发现go的reflect被大量使用,虽然反射的机制大多数语言都支持,但好像都没有go一样这么依赖反射的特性。个人觉得,reflect使用如此频繁的一个重要原因离不开go的另一个特性,空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。 另外,虽然反射大大增加了go语言的灵活性,但要完全掌握它的原理和使用也还是有一点难度的。 go的reflect库有两个重要的类型: reflect.Type reflect.Value Type,Value分别对应对象的类型和值数据 还有两个重要的函数: reflect.TypeOf(i interface{}) Type reflect.TypeOf()返...阅读全文

博文 2014-10-11 10:15:04 kenshin

Golang中获取中文字符串的子串字符位置及截取子串

昨天准备用golang做一个简单的文本分析,需要简单的对字符串进行一些操作,在查看了strings和strconv库时,我没找到截取字符串的函数,同时strings.Index返回的是子串的字节位置,例如这个例子:strings.Index("早上好,张先生!","好") 的返回值是6,而不是2(从0开始算)。 于是我自己写了一个处理中文的返回字符串子串位置的函数,思想其实很简单,首先通过strings库中的Index函数获得子串的字节位置,再通过这个位置获得子串之前的字节数组pre,再将pre转换成[]rune,获得[]rune的长度,便是子串之前字符串的长度,也就是子串在字符串中的字符位置,具体代码如下: func UnicodeIndex(str,substr string) int ...阅读全文

博文 2014-10-10 11:00:01 wowzai

Go的语言特性总结

写在前面: 近来关于对Golang的讨论有很多,七牛的几个大牛们也断定Go语言在未来将会快速发展,并且很可能会取代Java成为互联网时代最受欢迎的编程语言。Go语言是google推出的编程语言,在已经成功的给世人创造了改变人们生活的操作系统之后,google似乎感觉有必要再为世人带来一款强大的编程语言,而Go语言依靠自己众多友好的特性也不负众望正在被开发者接触,我有幸在学习高性能并发编程的时候认识了Go语言,在了解了Go的一些特性之后决定系统的学习一番。我发现关于Go的学习资料并不多,以至于我需要自己写一些东西。这里的内容大多来自七牛团队的《Go语言编程》一书。这里也会按照书中组织的章节进行学习。当然如果一些知识点事互联网上已经有的,这里直接进行转载了。 -Written by Lingta...阅读全文

博文 2015-05-02 00:00:14 u011321908

GoLang之对象

GoLang之面向对象 Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承、虚函数、构造函数和析构函数、隐藏的this指针等。 类方法 在Go语言中,可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法。 如下面的这个例子,定义了一个新类型Integer,它和int一样,只是为它内置的int类型增加了个新方法Less() type Integer int func (a Integer) Less(b Integer) bool { return a < b } func main() { var a Integer = 1 if a.Less(2) { fmt.Println("less then 2") } } 可以看出,Go语言在自定义类型的对象中没有C++/Java那种...阅读全文

博文 2015-05-13 03:00:05 chenny7

golang模板语法简明教程

【模板标签】 模板标签用"{{"和"}}"括起来 【注释】 {{/* a comment */}} 使用“{{/*”和“*/}}”来包含注释内容 【变量】 {{.}} 此标签输出当前对象的值 {{.Admpub}} 表示输出Struct对象中字段或方法名称为“Admpub”的值。 当“Admpub”是匿名字段时,可以访问其内部字段或方法,比如“Com”:{{.Admpub.Com}} , 如果“Com”是一个方法并返回一个Struct对象,同样也可以访问其字段或方法:{{.Admpub.Com.Field1}} {{.Method1 "参数值1" "参数值2"}} 调用方法“Method1”,将后面的参数值依次传递给此方法,并输出其返回值。 {{$admpub}} 此标签用于输出在模板中定义...阅读全文

博文 2015-05-13 12:00:01 ____追梦人

golang mysql中timestamp,datetime,int类型的区别与优劣

golang time: https://golang.org/pkg/time/ golang中time包用法 http://blog.csdn.net/chenbaoke/article/details/41519193 首先 DATETIM和TIMESTAMP类型所占的存储空间不同,前者8个字节,后者4个字节,这样造成的后果是两者能表示的时间范围不同。前者范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,后者范围为1970-01-01 08:00:01到2038-01-19 11:14:07。所以可以看到TIMESTAMP支持的范围比DATATIME要小,容易出现超出的情况. 其次,TIMESTAMP类型在默认情况下,insert、update ...阅读全文

博文 2016-03-04 08:00:01 scut1135

Go实例学:函数多返回值

Go语言内置支持多返回值,这个在Go语言中用的很多,比如一个函数同时返回结果和错误信息。 package main import "fmt" // 这个函数的返回值为两个int func vals() (int, int) { return 3, 7 } func main() { // 获取函数的两个返回值 a, b := vals() fmt.Println(a) fmt.Println(b) // 如果你只对多个返回值里面的几个感兴趣 // 可以使用下划线(_)来忽略其他的返回值 _, c := vals() fmt.Println(c) } 输出结果为 3 7 ...阅读全文

博文 2014-11-29 17:00:01 Goopand

Go学习笔记之:字典

字典是Go语言内置的关联数据类型。因为数组是索引对应数组元素,而字典是键对应值。 package main import "fmt" func main() { // 创建一个字典可以使用内置函数make // "make(map[键类型]值类型)" m := make(map[string]int) // 使用经典的"name[key]=value"来为键设置值 m["k1"] = 7 m["k2"] = 13 // 用Println输出字典,会输出所有的键值对 fmt.Println("map:", m) // 获取一个键的值 "name[key]". v1 := m["k1"] fmt.Println("v1: ", v1) // 内置函数返回字典的元素个数 fmt.Println("...阅读全文

博文 2014-11-27 23:00:02 Goopand

使用for循环对 golang 中结构体数组取值进行修改时,需要注意的问题

废话少说,直接上代码: type a1 struct { key1 string key2 string key3 string } testData := []a1{ a1{"1","2", "3"}, a1{"4","5", "6"}, } 上面的代码定义了一个结构体,声明了一个数组。 采用循环变量可以修改数组中结构体的取值: for i := 0; i < len(testData); i++ { testData[i].key3 = "999" } fmt.Printf("%v", testData) 输出:[{1 2 999} {4 5 999}] 采用 range 获取的下标值,然后用下标方式引用的数组项也可以直接修改: for idx, _ := range testData ...阅读全文

博文 2018-02-27 10:33:04 LeoXu

Golang中的interface,一看就明白

Golang中的interface,一看就明白 先说说接口,接口我理解为一些行为的集合。似乎还是很懵x。来看看代码和允许效果,再说。 package main import "fmt" type TypeCalculator interface { TypeCal() string } type Worker struct { Type int Name string } type Student struct { Name string } func (w Worker) TypeCal() string { if w.Type == 0 { return w.Name +"是蓝翔毕业的员工" } else { return w.Name+"不是蓝翔毕业的员工" } } func (s S...阅读全文

博文 2018-12-07 19:34:43 小小程序员Eric

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中goconfig包使用解析

注意事项 本博客隶属于 goconfig - 课时 1:goconfig 使用解析 请注意配套使用。 本博文为 goconfig - Go 语言 INI 解析器的配套博客,旨在通过文字结合代码示例对该库的使用方法和案例进行讲解,便于各位同学更好地使用和深入了解。 库简介 goconfig 是一个由 Go 语言开发的针对 Windows 下常见的 INI 格式的配置文件解析器。该解析器在涵盖了所有 INI 文件操作的基础上,又针对 Go 语言实际开发过程中遇到的一些需求进行了扩展。相对于其它 INI 文件解析器而言,该解析器最大的优势在于对注释的极佳支持;除此之外,支持多个配置文件覆盖加载也是非常特别但好用的功能。 下载安装 您可以通过以下两种方式下载安装 goconfig: gopm get...阅读全文

博文 2015-10-28 22:00:41 chenbaoke

Golang func -函数 1

不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return } 通过函数定义,我们可以看到Go中函数和其他语言中的共性和特性 共性 关键字——func方法名——funcName入参——— a,b int,b string返回值—— r,s int函数体—— {} 特性 Go中函数的特性是非常酷的,给我们带来不一样的编程体验。 为特定类型定义函数,即为类型对象定义方法 在Go中通过给函数标明所属类型,来给该类型定义方法,上面的 p myType 即表示给myType声明了一个方法, p myType 不是必须的。如果没有,则纯粹是一个函数,通过包名称访问。pack...阅读全文

博文 2016-07-14 18:00:01 lsm135

Golang依赖注入框架wire全攻略

在前一阵介绍单元测试的系列文章中,曾经简单介绍过wire依赖注入框架。但当时的wire还处于alpha阶段,不过最近wire已经发布了首个beta版,API发生了一些变化,同时也承诺除非万不得已,将不会破坏API的兼容性。在前文中,介绍了一些wire的基本概况,本篇就不再重复,感兴趣的小伙伴们可以回看一下:搞定Go单元测试(四)—— 依赖注入框架(wire)。本篇将具体介绍wire的使用方法和一些最佳实践。 本篇中的代码的完整示例可以在这里找到:wire-examples Installing go get github.com/google/wire/cmd/wire 复制代码Quick Start 我们先通过一个简单的例子,让小伙伴们对wire有一个直观的认识。下面的例子展示了一个简易w...阅读全文

博文 2019-07-28 23:34:15 水立方

golang返回值为interface{}的类型判断

看标题就知道,这是一个很简单的问题,就一个函数的事,但是,今天一同学golang的几个人中,已经不止一个人问我了,在这里我就说一下,也希望对不清楚的娃有些许帮助,大神别喷,飘过就行了。 大家知道,golang对于不确定返回值可以用interface{}代替,这确实很方便,但是也带来了问题,那就是如何判断返回值是什么类型的?其实可以用反射也就是reflect来判断,通过函数 reflect.TypeOf() 即返回类型! $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('

博文 2016-04-10 20:00:01 u013025612

golang学习的点点滴滴:range使用总结

1、当range作用于string时, 第一个返回值为index,第二次是char str := "hello world" for index, ch := range str { fmt.Printf("%d --- %c\n", index, ch) } 2、当range作用于array时, 第一个返回值为index,第二次是value func PrintArray(array [5]int) { for index, res := range array { fmt.Println(index, "--", res) } } func main() { array := [5]int{1,2,3,4,5} PrintArray(array) } 3、当range作用于slice时,...阅读全文

博文 2014-10-04 19:27:41 亓斌哥哥

Go语言学习记录之一(返回指针与返回值的区别)

先来一个返回指针的测试,结果跟想象一样 type A map[int]string type B struct { A c int } func main() { b := B{make(A), 10} NewB := func() *B { return &b } c := NewB() c.c = 100 c.A[1] = "3" fmt.Println(b, c) } /* output {map[1:3] 100} &{map[1:3] 100} */ 再试试直接返回值,这下的输出和想象中不一样了 type A map[int]string type B struct { A c int } func main() { a := B{make(A), 10} b := B{make(...阅读全文

博文 2015-10-09 11:00:11 inu1255

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

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

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

Golang面试题解析(二)

12.是否可以编译通过?如果通过,输出什么? func main() { i := GetValue() switch i.(type) { case int: println("int") case string: println("string") case interface{}: println("interface") default: println("unknown") } } func GetValue() int { return 1 } 解析 考点:type 编译失败,因为type只能使用在interface 13.下面函数有什么问题? func funcMui(x,y int)(sum int,error){ return x+y,nil } 解析 考点:函数返回值命名...阅读全文

博文 2017-08-24 12:33:17 梦朝思夕

go使用Defer的几个场景

Go 语言中的 defer 语句是 UNIX 之父 Ken Thompson 大神发明的, 是完全正交的设计. 也正因为 Go 语言遵循的是正交的设计, 所以才有了: “少是指数级的多/Less is exponentially more” 的说法. 因为是正交的设计, 最终得到的组合形式是指数级的组合形式. 相反, C++的特性虽然很多, 但是很多不是正交的设计, 而只是简单的特性罗列, 所以C++的很多地方是无法达到指数级的多的组合方式的. 但是学习成本却非常高. 简单的例子就是C++的构造函数和析构函数和C语言的函数和struct完全是互斥的. 具体的例子可以参考: C++去掉构造函数会怎么样? 关于 Go 语言中 defer 语句的详细介绍请参考: Defer, Panic, and...阅读全文

博文 2016-02-03 07:00:06 yangyangye

Go语言示例-函数返回多个值

Go语言中函数可以返回多个值,这和其它编程语言有很大的不同。对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性。 简单如交换两个数值的例子: package main import "fmt" func swap(a int, b int) (int, int) { return b, a } func main() { a := 1 b := 2 a, b = swap(a, b) fmt.Println(a) fmt.Println(b) } 输出结果为: 2 1 如果在其它语言中,我们第一想到的肯定是建立一个中间变量做交换。但在Go使用返回多个值的功能很容易的就实现了。 另外,在Go中,声明的变量没有使用的话,编译无法通过。所以如果多返回值函数返回的...阅读全文

博文 2015-03-04 03:00:02 baiyuxiong

对比学习:Golang VS Python3

Golang和Python都是目前在各自领域最流行的开发语言之一。 Golang其高效而又友好的语法,赢得了很多后端开发人员的青睐,最适用于高并发网络编程的语言之一。 Python不用说,TIOBE排行榜的前十常驻居民,现在已经稳定在前五了。在机器学习、AI、数据分析领域成为必学语言。 两门编程语言在语法上都有各自的特点,而且都易学易用。 本文对比这两门语言目的不是争谁优谁略,只是为了对比学习,适合掌握Python想学Go或者掌握Go想学Python的同学们参考。 Go和Python,一个是静态语言一个是动态语言,从各个方面来看,都有根本性的差异,所以,文中很多内容不进行深入的比较了,我们只从程序员最直观的语法面做对比。 为了便于阅读,文中涉及代码都采用尽量简单的语句呈现 字符编码 Pyth...阅读全文

博文 2019-05-13 18:34:46 ZetaChow晓代码