go 速学 - 15 - 并发

目录 并发 goroutine 使用 goroutine Channel 概述 建立 Channel 单向 Channel 使用没有缓存的 Channel 使用有缓存的 Channel 多线程同步 开启多线程 使用 Channel 同步 使用 WaitGroup 同步 Select 概述 使用 Select 设置 Timeout 摘要 goroutine,Channel 作用,单向与双向 channel,生产者与消费者模式,缓存与无缓存 channel,同步与异步,WaitGroup,Selec...阅读全文

阅读:2161 评论:0

go 速学 - 09 - 函数

目录 函数 特点 定义函数 变参 闭包与柯理化 闭包 柯理化 摘要 定义函数,多个返回值,命名返回值,变参,闭包,柯理化 函数 特点 不支持嵌套,重载和默认参数 支持闭包 定义函数 //单个返回值,可以省略括号 func test0(a int, b string) int { return a } //多个返回值 func test1(a int, b string) (int, string) { return a, b } //无返回值 func test2(a int, b string...阅读全文

2015-04-06 13:22 mrseasons
阅读:1870 评论:0

go 速学 - 11 - 结构

目录 结构 概念 创建结构 使用结构 值传递 匿名结构 结构的组合 概念 定义一个组合 使用组合 摘要 定义结构,使用结构,值传递与指针传递,匿名结构,结构的组合 结构 概念 Go 中没有 class 的概念,结构可以完成类似功能 支持指向自身的指针类型成员 支持匿名结构 支持 == 和 != 运算符 创建结构 格式 type <Name> struct{} type person struct { name string age int } 使用结构 结构变量的各个字段都会有默认值 p1 :=...阅读全文

阅读:2091 评论:0

go 速学 - 12 - 方法

目录 Method 概念 定义 Method 使用 Method 为类型别名添加方法 摘要 receiver,定义方法,使用方法(2种形式),为类型别名添加方法 Method 概念 一个方法即是包含一个隐藏参数 (receiver) 的函数。 只能为同一个包中的类型定义方法 Receiver 指的是方法依赖的主体 Receiver 可以是值或指针 不存在方法重载 定义 Method type person struct { name string } //为 person 结构定义了一个 met...阅读全文

阅读:2630 评论:0

go 速学 - 14 - 反射

目录 反射 reflection 使用反射 前提 定义一个结构及方法 反射所有字段及方法 访问结构中的匿名字段 动态修改属性的值 动态调用方法 摘要 使用反射,匿名字段,动态修改属性,动态调用方法 反射 reflection 使用反射 前提 使用反射之前必须引用包 reflect 定义一个结构及方法 import "reflect" type User struct { Id int Name string Age int } func (u User) say() { fmt.Println(...阅读全文

2015-04-07 11:17 mrseasons
阅读:5195 评论:0

go 速学 - 10 - defer 与异常处理

目录 defer 与异常处理 概述 defer 定义多个 defer 改变返回值 panic 与 recover 使用 panic 使用 recover 摘要 defer,defer 栈,改变返回值,panic,recover defer 与异常处理 概述 Go 没有 try..catch 这种异常机制,而是使用 panic 和 recover。 panic 在任何地方都可以执行,recover 只有在 defer 调用的函数中才有效。 defer defer 用于定义在函数执行结束后执行的语句...阅读全文

2015-04-06 13:26 mrseasons
阅读:2651 评论:0

go 速学 - 13 - Interface

目录 interface 概念 定义接口 实现接口 作为参数的接口 接口类型转换 嵌入接口 空接口 nil 接口 摘要 定义接口,实现接口,使用接口,作为参数的接口,if 和 switch 中的接口,类型转换,嵌入接口,空接口 interface 概念 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显式声明实现哪个接口 接口只有方法声明,无实现,无字段 当接口存储的类型和对象都为 nil 时,接口才为 nil 接口调用不会做 receiver 的自动转换,即指针只能传指针 空接口可以...阅读全文

阅读:2039 评论:0

go 速学 - 06 - 数组

目录 数组 创建数组 数组的比较 数组与指针 指向数组的指针 数组指针 New 多维数组 摘要 创建数组(指定长度,不指定长度,指定索引),数组指针与指向数组的指针,new 数组 创建数组 直接指定长度 var score [3]int //[0 0 0] 指定长度并初始化 score1 := [2]int{3, 4} //[3 4] 利用索引初始化 score2 := [10]int{3: 4, 9: 1} //[0 0 0 4 0 0 0 0 0 1] 不直接指定长度 score3 := [...阅读全文

2015-04-03 09:54 mrseasons
阅读:1728 评论:0

go 速学 - 01 - 安装与运行

目录 安装与运行 Go 特点 安装 第一个例子 摘要 go run 安装与运行 Go 特点 支持并发,垃圾回收的编译型系统编程语言 导入没有使用过的包时会报错 安装 Mac os brew install go 第一个例子 建立一个文件,名为 “hello.go”,添加如下内容 package main import "fmt" func main() { fmt.Println("Hello, 世界") } 运行此段代码 E:\blog\go>go run hello.go Hello wor...阅读全文

阅读:1654 评论:0

go 速学 - 07 - Slice

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

阅读:1962 评论:0

go 速学 - 04 - 常量,操作符与指针

目录 常量操作符与指针 常量 定义 iota 操作符 指针 摘要 定义常量,常量组,上行表达式,iota,++/–,指针 常量,操作符与指针 常量 定义 常量使用 const 关键字进行定义 常量的值在编译时确定,所以运行时无法改变 常量表达式中的函数必须是内置函数(因为自己写的函数的返回值是在运行时确定的) 示例 const ( text, size = "text", len(text) ) 常量组中如果不指定默认值则使用上行表达式的值 const ( a = 1 //常量必须有值,所以a必...阅读全文

2015-04-02 11:52 mrseasons
阅读:2846 评论:0

go 速学 - 08 - Map

目录 Map 创建 Map Setter 和 Getter Size 删除一个元素 Map 嵌套 检查键是否存在 遍历 摘要 创建 Map,make,setter,getter,size,delete,检查键的存在,遍历 Map 创建 Map 定义后再初始化 var m1 map[int]string m1 = map[int]string{} //m1 map[] 使用 make 函数 格式为 make([keyType]valueType, cap) 容量可以省略 var m2 map[in...阅读全文

2015-04-03 10:16 mrseasons
阅读:2188 评论:0

go 速学 - 05 - 流程控制

目录 流程控制 判断语句 if 循环语句 for 跳转语句 switch 摘要 if,for 的三种形式,switch两种形式,switch 与 break 流程控制 判断语句 if 基本语法 if 后没有小括号 支持变量初始化,初始化的变量要以 “;” 结尾 使用变量初始化产生的变量,作用域仅在 if 语句之内 if 1 < 2 { fmt.Println(1) //1 } if a := 5; a > 3 { //变量初始化 a fmt.Println(a) //5 } //fmt.Prin...阅读全文

阅读:2051 评论:0

Golang心得

先大概说下为什么用 Golang。我是一个对语言有洁癖的人,曾经是一个C+Python 的坚定呐喊者,最常说的一句话就是,只要熟练这两种,什么情况都能应付,根本不用 Java 和 C++(纯指我所在的领域)。核心代码用C,速度快,需要记的语言细节少;外围用 Python glue,灵活,简洁,任何模块都容易上手,绝配。Java 的繁琐,C++ 的无数无用的特性,都让我只在不得不用的时候才去用。Objective-C 是另一个我欣赏的语言,问题是不跨平台,过于封闭。 可惜的是,在这个节奏极快的时代...阅读全文

2015-04-15 10:38 wjk88888
阅读:54005 评论:6

go 速学 - 02 - 包与可见性

目录 包与可见性 包 基本结构 别名 可见性规则 摘要 导入多个包,包的别名,可见性 包与可见性 包 基本结构 包的基本结构如下 //程序运行的入口是包 `main`。 package main //导入包 "fmt" 和 "math/rand" import ( "fmt" "math/rand" ) //或 import std "fmt" //指定别名 import "math" // 常量的定义 const PI = 3.14 // 全局变量的声明与赋值 var name = "goph...阅读全文

阅读:1638 评论:0

Golang 微框架 Gin 简介

所谓框架 框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了。成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应手的时候,可以尝试改造一些框架,或是自己创造一个。 曾经我以为Python世界里的框架已经够多了,后来发现相比golang简直小巫见大巫。golang提供的net/http库已经很好了,对于http的协议的实现非常好,基于此再造框架,也不会是难事,因此生态中出现了很多框架。既然构造框架的门...阅读全文

2017-12-04 00:03:06 mickelfeng
阅读:48521 评论:1

Go 语言的缓冲通道:提示和技巧

Mahadevan Ramachandran • January 15 通道和 goroutine 是 Go 语言基于 CSP( communicating sequential processes ,通信顺序进程)并发机制的核心部分。阅读本文可以学到一些关于channel的提示和技巧,尤其是“缓冲” channel ,在 “生产者-消费者” 情境中广泛使用了缓冲通道作为队列。 ## 缓冲通道 = 队列 缓冲通道是固定容量的先进先出(FIFO)队列。容量在队列创建的时候就已经固...阅读全文

阅读:3569 评论:0

Go vs Python:深入并发

## 介绍 在过去的几个月里,我在几个项目上使用过 Go,尽管我还算不上专家,但是还是有几件事我要感谢 Go:首先,它有一个清晰而简单的语法,我不止一次注意到 Github 开发人员的风格非常接近于旧 C 程序中使用的风格,从理论上讲,Go 似乎吸收了世界上所有语言最好的特性:它有着高级语言的力量,明确的规则使得更简单,即使这些特性有时有一点点的约束力--就是可以给代码强加一个坚实的逻辑。这是命令式的简单,由大小以位为单位的原始类型组成。但是没有像把字符串当成字符数组那样操作的乏味。然而,...阅读全文

2018-02-13 17:23:12 polaris
阅读:5257 评论:0

选择一个 Go 框架

![](https://raw.githubusercontent.com/studygolang/gctt-images/master/choose-framework/heading.jpg) 每一天,或者是每隔几天,总有人来到 [/r/golang](https://www.reddit.com/r/golang/) ,并询问些类似如下的问题“哪个框架是最好的?”。我认为我们应该尝试提出这个问题,至少以一种容易理解的方式提出。你不应该使用框架。 对于一个复杂的问题,这也许是一个...阅读全文

2018-02-13 17:53:25 polaris
阅读:11765 评论:0

在 Linux 中使用 Go 作为脚本语言

在 `Cloudflare` 的人们都非常喜欢 Go 语言。我们在许多[内部软件项目](https://blog.cloudflare.com/what-weve-been-doing-with-go/)以及更大的[管道系统](https://blog.cloudflare.com/meet-gatebot-a-bot-that-allows-us-to-sleep/)中使用它。但是,我们能否进入下一个层次并将其用作我们最喜欢的操作系统 Linux 的脚本语言呢? ![image here...阅读全文

阅读:15208 评论:0