GO语言
文章平均质量分 65
尹成
尹成微信18510341407,助理微信18514203048
展开
-
Go编程语言评估报告
Go编程语言评估报告 1. Go简介 Go是由Google于2007年9月21日开始开发,2009年11月10日开放源码,2012年3月28日推出第一个正式版本的通用型编程语言。它为系统编程而7设计,是强类型化的语言,具有垃圾回收机制,并显式支持并发编程。Go程序由包构造,以此来提供高效的依赖管理功能。当前的编译器实现使用传统的“编译-链接”模型来生成可执行的二进制文件。十年以来,主流的系统级编...原创 2018-05-21 17:46:27 · 1186 阅读 · 0 评论 -
清华尹成带你实战GO案例(1) Go 状态协程
Go 状态协程在上面的例子中,我们演示了如何通过使用mutex来在多个协程之间共享状态。另外一种方法是使用协程内置的同步机制来实现。这种基于通道的方法和Go的通过消息共享内存,保证每份数据为单独的协程所有的理念是一致的。package mainimport ("fmt""math/rand""sync/atomic""time")// 在这个例子中,将有一个单独的协程拥有这个状态。这...原创 2018-05-21 17:58:51 · 714 阅读 · 0 评论 -
清华尹成带你实战GO案例(2) Go 字典
Go 字典字典是Go语言内置的关联数据类型。因为数组是索引对应数组元素,而字典是键对应值。package mainimport "fmt"func main() {// 创建一个字典可以使用内置函数make// "make(map[键类型]值类型)"m := make(map[string]int)// 使用经典的"name[key]=value"来为键设置值m["k1"] = 7...原创 2018-05-21 18:02:54 · 599 阅读 · 0 评论 -
清华尹成带你实战GO案例(3)Go 字符串操作函数
Go 字符串操作函数strings 标准库提供了很多字符串操作相关的函数。这里提供的几个例子是让你先对这个包有个基本了解。package mainimport s "strings"import "fmt"// 这里给fmt.Println起个别名,因为下面我们会多处使用。var p = fmt.Printlnfunc main() {// 下面是strings包里面提供的一些函数实例...原创 2018-05-21 18:04:40 · 460 阅读 · 0 评论 -
清华尹成带你实战GO案例(4)Go 字符串格式化
Go 字符串格式化Go对字符串格式化提供了良好的支持。下面我们看些常用的字符串格式化的例子。package mainimport "fmt"import "os"type point struct {x, y int}func main() {// Go提供了几种打印格式,用来格式化一般的Go值,例如// 下面的%v打印了一个point结构体的对象的值p := point{1, ...原创 2018-05-21 18:06:58 · 469 阅读 · 0 评论 -
清华尹成带你实战GO案例(5)Go 自定义排序
Go 自定义排序有的时候我们希望排序不是仅仅按照自然顺序排序。例如,我们希望按照字符串的长度来对一个字符串数组排序而不是按照字母顺序来排序。这里我们介绍一下Go的自定义排序。package mainimport "sort"import "fmt"// 为了能够使用自定义函数来排序,我们需要一个// 对应的排序类型,比如这里我们为内置的字符串// 数组定义了一个别名ByLengthty...原创 2018-05-21 18:08:40 · 492 阅读 · 0 评论 -
清华尹成带你实战GO案例(7)Go Defer
Go DeferDefer 用来保证一个函数调用会在程序执行的最后被调用。通常用于资源清理工作。package mainimport "fmt"import "os"// 假设我们想创建一个文件,然后写入数据,最后关闭文件func main() {// 在使用createFile得到一个文件对象之后,我们使用defer// 来调用关闭文件的方法closeFile,这个方法将在main函...原创 2018-05-21 18:19:57 · 444 阅读 · 0 评论 -
清华尹成带你实战GO案例(7)Go Exit
Go Exit使用 os.Exit 可以给定一个状态,然后立刻退出程序运行。package mainimport "fmt"import "os"func main() {// 当使用`os.Exit`的时候defer操作不会被运行,// 所以这里的``fmt.Println`将不会被调用defer fmt.Println("!")// 退出程序并设置退出状态值os.Exit(3)...原创 2018-05-21 18:21:46 · 676 阅读 · 0 评论 -
清华尹成带你实战GO案例(8)Go for循环
Go for循环for循环是Go语言唯一的循环结构。这里有三个基本的for循环类型。package mainimport "fmt"func main() {// 最基本的一种,单一条件循环// 这个可以代替其他语言的while循环i := 1for i <= 3 {fmt.Println(i)i = i + 1}// 经典的循环条件初始化/条件判断/循环后条件变化fo...原创 2018-05-21 18:24:12 · 619 阅读 · 0 评论 -
清华尹成带你实战GO案例(9)Go if..else if..else 条件判断
Go if..else if..else 条件判断Go语言的条件判断结构也很简单。package mainimport "fmt"func main() {// 基本的例子if 7%2 == 0 {fmt.Println("7 is even")} else {fmt.Println("7 is odd")}// 只有if条件的情况if 8%4 == 0 {fmt.Print...原创 2018-05-21 18:25:42 · 446 阅读 · 0 评论 -
清华尹成带你实战GO案例(10)Go JSON支持
Go JSON支持Go内置了对JSON数据的编码和解码,这些数据的类型包括内置数据类型和自定义数据类型。package mainimport "encoding/json"import "fmt"import "os"// 我们使用两个结构体来演示自定义数据类型的JSON数据编码和解码。type Response1 struct {Page intFruits []string}...原创 2018-05-21 18:28:25 · 441 阅读 · 0 评论 -
清华尹成带你实战GO案例(11)Go Line Filters
Go Line Filterspackage mainimport ("bufio""fmt""os""strings")func main() {// 使用缓冲scanner来包裹无缓冲的`os.Stdin`可以让我们// 方便地使用`Scan`方法,这个方法会将scanner定位到下// 一行的位置scanner := bufio.NewScanner(os.Stdin)...原创 2018-05-21 18:29:51 · 469 阅读 · 0 评论 -
清华尹成带你实战GO案例(12)Go Panic
Go PanicPanic表示的意思就是有些意想不到的错误发生了。通常我们用来表示程序正常运行过程中不应该出现的,或者我们没有处理好的错误。package mainimport "os"func main() {// 我们使用panic来检查预期不到的错误panic("a problem")// Panic的通常使用方法就是如果一个函数// 返回一个我们不知道怎么处理的错误的// 时...原创 2018-05-21 18:30:56 · 468 阅读 · 0 评论 -
清华尹成带你实战GO案例(13)Go range函数
Go range函数range函数是个神奇而有趣的内置函数,你可以使用它来遍历数组,切片和字典。当用于遍历数组和切片的时候,range函数返回索引和元素;当用于遍历字典的时候,range函数返回字典的键和值。package mainimport "fmt"func main() {// 这里我们使用range来计算一个切片的所有元素和// 这种方法对数组也适用nums := []int{...原创 2018-05-21 18:32:29 · 492 阅读 · 0 评论 -
清华尹成带你实战GO案例(14)Go SHA1 散列
Go SHA1 散列SHA1散列经常用来计算二进制或者大文本数据的短标识值。git版本控制系统用SHA1来标识受版本控制的文件和目录。这里介绍Go中如何计算SHA1散列值。Go在 crypto/* 包里面实现了几个常用的散列函数。package mainimport "crypto/sha1"import "fmt"func main() {s := "sha1 this string"...原创 2018-05-21 18:33:41 · 427 阅读 · 0 评论 -
清华尹成带你实战GO案例(15)Go String与Byte切片之间的转换
Go String与Byte切片之间的转换String转换到Byte数组时,每个byte(byte类型其实就是uint8)保存字符串对应字节的数值。注意Go的字符串是UTF-8编码的,每个字符长度是不确定的,一些字符可能是1、2、3或者4个字节结尾。示例1:package mainimport "fmt"func main() {s1 := "abcd"b1 := []byte(s1)f...原创 2018-05-21 18:35:06 · 1625 阅读 · 0 评论 -
清华尹成带你实战GO案例(16)Go Switch语句
Go Switch语句当条件判断分支太多的时候,我们会使用switch语句来优化逻辑。package mainimport "fmt"import "time"func main() {// 基础的switch用法i := 2fmt.Print("write ", i, " as ")switch i {case 1:fmt.Println("one")case 2:fmt....原创 2018-05-21 18:36:17 · 412 阅读 · 0 评论 -
清华尹成带你实战GO案例(17) Go URL解析
Go URL解析URL提供了一种统一访问资源的方式。我们来看一下Go里面如何解析URL。package mainimport "fmt"import "net/url"import "strings"func main() {// 我们将解析这个URL,它包含了模式,验证信息,// 主机,端口,路径,查询参数和查询片段s := "postgres://user:pass@host.c...原创 2018-05-21 18:37:31 · 495 阅读 · 0 评论 -
清华尹成带你实战GO案例(18)Go 闭包函数
Go 闭包函数Go支持匿名函数,匿名函数可以形成闭包。闭包函数可以访问定义闭包的函数定义的内部变量。示例1:package mainimport "fmt"// 这个"intSeq"函数返回另外一个在intSeq内部定义的匿名函数,// 这个返回的匿名函数包住了变量i,从而形成了一个闭包func intSeq() func() int {i := 0return func() int ...原创 2018-05-21 18:40:40 · 581 阅读 · 0 评论 -
清华尹成带你实战GO案例(19)Go变量
Go变量Go是静态类型语言,变量是有明确类型的。编译器会检查函数调用中,变量类型的正确性。使用 var 关键字来定义变量。Go 的基本类型有:boolstringint int8 int16 int32 int64uint uint8 uint16 uint32 uint64 uintptrbyte // uint8 的别名rune // int32 的别名 代表一个Unicode码float32...原创 2018-05-22 08:32:40 · 443 阅读 · 0 评论 -
清华尹成带你实战GO案例(22)Go常量
Go常量Go支持定义字符常量,字符串常量,布尔型常量和数值常量。使用 const 关键字来定义常量。package mainimport "fmt"import "math"// "const" 关键字用来定义常量const s string = "constant"func main() {fmt.Println(s)// "const"关键字可以出现在任何"var"关键字原创 2018-05-22 08:37:00 · 423 阅读 · 0 评论 -
清华尹成带你实战GO案例(23)Go 超时
Go 超时超时对那些连接外部资源的程序来说是很重要的,否则就需要限定执行时间。在Go里面实现超时很简单。我们可以使用channel和select很容易地做到。package mainimport "time"import "fmt"func main() {// 在这个例子中,假设我们执行了一个外部调用,2秒之后将结果写入c1c1 := make(chan string, 1)go f...原创 2018-05-22 08:38:04 · 425 阅读 · 0 评论 -
清华尹成带你实战GO案例(25)Go 打点器
Go 打点器Timer是让你等待一段时间然后去做一件事情,这件事情只会做一次。而Ticker是让你按照一定的时间间隔循环往复地做一件事情,除非你手动停止它。package mainimport "time"import "fmt"func main() {// Ticker使用和Timer相似的机制,同样是使用一个通道来发送数据。// 这里我们使用range函数来遍历通道数据,这些数据每...原创 2018-05-22 08:40:44 · 505 阅读 · 0 评论 -
清华尹成带你实战GO案例(26)Go 递归函数
Go 递归函数Go语言支持递归函数,这里是一个经典的斐波拉切数列的列子。package mainimport "fmt"// fact函数不断地调用自身,直到达到基本状态fact(0)func fact(n int) int {if n == 0 {return 1}return n * fact(n-1)}func main() {fmt.Println(fact(7))}...原创 2018-05-22 08:41:43 · 392 阅读 · 1 评论 -
清华尹成带你实战GO案例(27)Go 读取文件
Go 读取文件读写文件是很多程序的基本任务,下面我们看看Go里面的文件读取。package mainimport ("bufio""fmt""io""io/ioutil""os")// 读取文件的函数调用大多数都需要检查错误,// 使用下面这个错误检查方法可以方便一点func check(e error) {if e != nil {panic(e)}}func ma...原创 2018-05-22 08:43:09 · 496 阅读 · 0 评论 -
清华尹成带你实战GO案例(28)Go 方法
Go 方法一般的函数定义叫做函数,定义在结构体上面的函数叫做该结构体的方法。示例1:package mainimport "fmt"type rect struct {width, height int}// 这个area方法有一个限定类型*rect,// 表示这个函数是定义在rect结构体上的方法func (r *rect) area() int {return r.width ...原创 2018-05-22 08:45:21 · 1036 阅读 · 0 评论 -
清华尹成带你实战GO案例(29)Go 工作池
Go 工作池在这个例子中,我们来看一下如何使用gorouotine和channel来实现工作池。package mainimport "fmt"import "time"// 我们将在worker函数里面运行几个并行实例,这个函数从jobs通道// 里面接受任务,然后把运行结果发送到results通道。每个job我们// 都休眠一会儿,来模拟一个耗时任务。func worker(id ...原创 2018-05-22 08:46:32 · 597 阅读 · 0 评论 -
清华尹成带你实战GO案例(30)Go 关闭通道
Go 关闭通道关闭通道的意思是该通道将不再允许写入数据。这个方法可以让通道数据的接受端知道数据已经全部发送完成了。package mainimport "fmt"// 在这个例子中,我们使用通道jobs在main函数所在的协程和一个数据// 接收端所在的协程通信。当我们数据发送完成后,我们关闭jobs通道func main() {jobs := make(chan int, 5)don...原创 2018-05-22 08:47:40 · 452 阅读 · 0 评论 -
清华尹成带你实战GO案例(31)Go 函数定义
Go 函数定义函数是Go语言的重要内容。package mainimport "fmt"// 这个函数计算两个int型输入数据的和,并返回int型的和func plus(a int, b int) int {// Go需要使用return语句显式地返回值return a + b}func main() {// 函数的调用方式很简单// "名称(参数列表)"res := plus...原创 2018-05-22 08:48:42 · 401 阅读 · 0 评论 -
清华尹成带你实战GO案例(32)Go 函数多返回值
Go 函数多返回值Go语言内置支持多返回值,这个在Go语言中用的很多,比如一个函数同时返回结果和错误信息。package mainimport "fmt"// 这个函数的返回值为两个intfunc vals() (int, int) {return 3, 7}func main() {// 获取函数的两个返回值a, b := vals()fmt.Println(a)fmt.Pr...原创 2018-05-22 08:49:44 · 395 阅读 · 0 评论 -
清华尹成带你实战GO案例(34)Go 函数命名返回值
Go 函数命名返回值函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。如果命名了返回值参数,一个没有参数的 return 语句,会将当前的值作为返回值返回。注意,如果遇到if等代码块和返回值同名,还需要显示写出返回值。package mainimport "fmt"func split(sum int) (x, y int) {x = ...原创 2018-05-22 08:51:27 · 461 阅读 · 0 评论 -
清华尹成带你实战GO案例(35)Go 互斥
Go 互斥上面的例子中,我们看过了如何在多个协程之间原子地访问计数器,对于更复杂的例子,我们可以使用Mutex 来在多个协程之间安全地访问数据。package mainimport ("fmt""math/rand""runtime""sync""sync/atomic""time")func main() {// 这个例子的状态就是一个mapvar state =原创 2018-05-22 08:52:56 · 407 阅读 · 0 评论 -
清华尹成带你实战GO案例(36)Go 环境变量
Go 环境变量环境变量是一种很普遍的将配置信息传递给Unix程序的机制。package mainimport "os"import "strings"import "fmt"func main() {// 为了设置一个key/value对,使用`os.Setenv`// 为了获取一个key的value,使用`os.Getenv`// 如果所提供的key在环境变量中没有对应的value...原创 2018-05-22 08:54:01 · 502 阅读 · 0 评论 -
清华尹成带你实战GO案例(37)Go 集合功能
Go 集合功能我们经常需要程序去处理一些集合数据,比如选出所有符合条件的数据或者使用一个自定义函数将一个集合元素拷贝到另外一个集合。在一些语言里面,通常是使用泛化数据结构或者算法。但是Go不支持泛化类型,在Go里面如果你的程序或者数据类型需要操作集合,那么通常是为集合提供一些操作函数。这里演示了一些操作strings切片的集合函数,你可以使用这些例子来构建你自己的函数。注意在有些情况下,使用内联集...原创 2018-05-22 08:55:33 · 484 阅读 · 0 评论 -
清华尹成带你实战GO案例(38)Go 接口
Go 接口接口是一个方法签名的集合。所谓方法签名,就是指方法的声明,而不包括实现。package mainimport "fmt"import "math"// 这里定义了一个最基本的表示几何形状的方法的接口type geometry interface {area() float64perim() float64}// 这里我们要让正方形square和圆形circle实现这个接口...原创 2018-05-22 08:56:51 · 542 阅读 · 0 评论 -
清华尹成带你实战GO案例(39)Go 结构体
Go 结构体Go语言结构体数据类是将各个类型的变量定义的集合,通常用来表示记录。package mainimport "fmt"// 这个person结构体有name和age成员type person struct {name stringage int}func main() {// 这个语法创建一个新结构体变量fmt.Println(person{"Bob", 20})//...原创 2018-05-22 09:00:41 · 441 阅读 · 0 评论 -
清华尹成带你实战GO案例(40)Go 进程触发
Go 进程触发有的时候,我们需要从Go程序里面触发一个其他的非Go进程来执行。package mainimport "fmt"import "io/ioutil"import "os/exec"func main() {// 我们从一个简单的命令开始,这个命令不需要任何参数// 或者输入,仅仅向stdout输出一些信息。`exec.Command`// 函数创建了一个代表外部进程的对...原创 2018-05-22 09:02:02 · 445 阅读 · 0 评论 -
清华尹成带你实战GO案例(41)Go 进程执行
Go 进程执行在上面的例子中,我们演示了一下如何去触发执行一个外部的进程。我们这样做的原因是我们希望从Go进程里面可以访问外部进程的信息。但有的时候,我们仅仅希望执行一个外部进程来替代当前的Go进程。这个时候,我们需要使用Go提供的 exec 函数。package mainimport "syscall"import "os"import "os/exec"func main() {//...原创 2018-05-22 09:03:08 · 467 阅读 · 1 评论 -
清华尹成带你实战GO案例(42)Go 经典hello world
Go 经典hello world我们的第一个例子是打印经典的“hello world”信息,我们先看下代码。package mainimport "fmt"func main() {fmt.Println("hello world")}输出结果为:$ lsel_01_hello_world.go$ go build el_01_hello_world.go$ lsel_01_hello_w...原创 2018-05-22 09:04:15 · 448 阅读 · 0 评论 -
清华尹成带你实战GO案例(43)Go 可变长参数列表
Go 可变长参数列表支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数。package mainimport "fmt"// 这个函数可以传入任意数量的整型参数func sum(nums ...int) {fmt.Print(nums, " ")total := 0for _, num := range nums {tota...原创 2018-05-22 09:05:18 · 429 阅读 · 0 评论