# go-by-example **Repository Path**: roferwoo/go-by-example ## Basic Information - **Project Name**: go-by-example - **Description**: Go编程实例(Go By Example) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-05-21 - **Last Updated**: 2021-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Go 编程实例 Go By Example > [官网(https://gobyexample.com/)](https://gobyexample.com/) 1. [Hello Word](01.hello_world.go) 2. [数据类型](02.values.go) Go 拥有多种值类型,包括字符串,整型,浮点型,布尔型等。 3. [变量](03.variables.go) *变量* 被显式声明,并可以被编译器用来检查函数调用时的类型正确性。 4. [常量](04.constant.go) Go 支持字符、字符串、布尔和数值 常量 。 5. [For 循环](05.for.go) 6. [if/else](06.if_else.go) 7. [switch/case](07.switch.go) 8. [数组 Arrays](08.arrays.go) 在 Go 中,*数组* 是一个具有固定长度且编号的元素序列。 9. [切片 Slice](09.slices.go) *Slice* 是 Go 中一个关键的数据类型,是一个比数组更加强大的序列接口。 > 注意:slice 和 数组 是不同的类型。 10. [关联数组 Maps](10.maps.go) *map* 是 Go 内置关联数据类型( 在一些其他的语言中称为哈希 (hash) 或者字典 (dict) )。 11. [Range 遍历](11.range.go) *range* 迭代各种各样的数据结构。 12. [函数 Functions](12.functions.go) *函数* 是 Go 的中心。 13. [多返回值函数](13.multiple_return_values.go) Go 内建 *多返回值* 支持。这个特性在 Go 语言中经常被用到, 例如用来同时返回一个 函数的结果 和 错误信息。 14. [变参函数](14.variadic_functions.go) 可变参数函数。在调用时可以用任意数量的参数。 例如,fmt.Println 是一个常见的变参函数。 15. [闭包 Closures](15.closures.go) Go 支持匿名函数,并能用其构造 *闭包*。 匿名函数在你想定义一个不需要命名的内联函数时是很实用的。 16. [递归 Recursion](16.recursion.go) 17. [指针 Pointers](17.pointers.go) Go 支持 *指针*,允许在程序中通过 **引用** 传递值或者数据结构。 18. [结构体 Structs](18.structs.go) Go 的结构体 (struct) 是带类型的字段 (fields) 集合。 这在组织数据时非常有用。 19. [方法 Methods](19.methods.go) Go 支持在结构体类型中定义方法 (methods) 。 20. [接口 Interfaces](20.interfaces.go) 接口 (Interfaces) 是命名了的方法签名 (signatures) 的集合。 21. [错误处理 Errors](21.errors.go) **符合 Go 语言习惯的做法是使用一个独立、明确的返回值来传递错误信息。** 这与使用异常 (exception) 的 Java 和 Ruby 以及在 C 语言中有时用到的重载 (overloaded) 的单返回 / 错误值有着明显的不同。 Go 语言的处理方式能清楚的知道哪个函数 返回了错误,并能像调用那些没有出错的函数一样调用。 22. [协程 Goroutines](22.goroutines.go) Go 协程 (goroutine) 在执行上来说是轻量级的线程。 23. [通道 Channels](23.channels.go) 通道 (Channels) 是连接多个 Go 协程的管道。你可以从一个 Go 协程 将值发送到通道,然后在别的 Go 协程中接收。 24. [通道缓冲 Buffering](24.channel_buffering.go) 默认情况下,通道是 *无缓冲* 的,这意味着只有对应的接收(`<- chan`) 通道准备好接收时,才允许进行发送(`chan <-`)。 *可缓存通道* 允许在没有对应接收方的情况下,缓存限定数量的值。 25. [通道同步 Synchronization](25.channel_synchronization.go) 我们可以使用通道来同步 Go 协程间的执行状态。这里是一个 使用阻塞的接受方式来等待一个 Go 协程的运行结束。 26. [通道方向 Directions](26.channel_directions.go) 当使用通道作为函数的参数时,你可以指定这个通道是不是 只用来发送或者接收值。这个特性提升了程序的类型安全性。 27. [通道选择器 Select](27.select.go) Go 的通道选择器 让你可以同时等待多个通道操作。 Go 协程和通道以及选择器的结合是 Go 的一个强大特性。 28. [超时处理 Timeouts](28.timeouts.go) *超时* 对于一个连接外部资源,或者其它一些需要花费执行时间 的操作的程序而言是很重要的。 得益于通道和 `select`,在 Go 中实现超时操作是简洁而优雅的。 使用这个 `select` 超时方式,需要使用通道传递结果。这对于 一般情况是个好的方式,因为其他重要的 Go 特性是基于通道和 `select` 的。 29. [非阻塞通道 Non-Blocking](29.non_blocking_channel_operations.go) 常规的通过通道发送和接收数据是阻塞的。 然而,我们可以 使用带一个 `default` 子句的 `select` 来实现非阻塞 的 发送、接收,甚至是非阻塞的多路 `select`。 30. [通道的关闭 Closing](30.closing_channels.go) *关闭* 一个通道意味着不能再向这个通道发送值了。这个特性可以 用来给这个通道的接收方传达工作已经完成的信息。 31. [通道遍历 Channels Range](31.range_over_channels.go) 32. [定时器 Timers](32.timers.go) 我们常常需要在后面一个时刻运行 Go 代码,或者在某段时间 间隔内重复运行。Go 的内置 *定时器* 和 *打点器* 特性让这 些很容易实现。 33. [打点器 Tickers](33.tickers.go) - 定时器 是当你想要在未来某一刻执行一次时 使用的。 - 打点器 则是当你想要在固定的时间间隔重复执行 准备的。 34. [线程池 Worker Pool](34.worker_pools.go) 35. [协程 WaitGroups](35.waitgroups.go) 想到等待多个协程完成,我们可以使用 *wait group*。 36. [速率限制 Rate Limiting](36.rate_limiting.go) *速率限制* 是 一个重要的控制服务资源利用和质量的途径。Go 中可以通过 Go 协程、通道和打点器来支持了速率限制。 37. [原子计数器 Atomic Counters](37.atomic_counters.go) 38. [互斥锁 Mutexes](38.mutexes.go) 39. [Go 状态协程 Stateful](39.stateful_goroutines.go) 40. [排序 Sorting](40.sorting.go) 41. [使用函数自定义排序](41.sorting_by_functions.go) 42. [Panic 异常](42.panic.go) `panic` 意味着有些出乎意料的错误发生。通常我们用它 来表示程序正常运行中不应该出现的,或者我们没有处理好的错误。 43. [Defer 延迟调用](43.defer.go) `defer` 被用来确保一个函数调用在程序执行结束前执行。同样用来执行一些清理工作。 `defer` 用在像其他语言中的 `ensure` 和 `finally` 用到的地方。 44. [组合函数 Collection](44.collection_functions.go) 45. [字符串函数 String](45.string_functions.go) 46. [字符串格式化](46.string_formatting.go) Go 在传统的 `printf` 中对字符串格式化提供了优异的支持。 47. [正则表达式](47.regular_expressions.go) 48. [JSON 解析](48.json.go) Go 提供内置的 JSON 编解码支持,包括内置或者自定义类 型与 JSON 数据之间的转化。 49. [XML 解析](49.xml.go) Go 的 `encoding.xml` 包为 XML 和 类 - XML 格式提供了内建支持。 50. [时间 Time](50.time.go) 51. [时间戳 Unix Epoch](51.epoch.go) 52. [时间的格式化和解析](52.time_formatting_parsing.go) 53. [随机数 math/rand](53.random_numbers.go) 54. [数字解析](54.number_parsing.go) 55. [URL 解析](55.url_parsing.go) 56. [SHA1 散列](56.sha1_hashes.go) 57. [Base64 编码](57.base64_encoding.go) 58. [读文件](58.reading_files.go) 59. [写文件](59.writing_files.go) 60. [行过滤器](60.line_filters.go) 一个 *行过滤器* 在读取标准输入流的输入,处理该输入,然后将得到的一些结果输出到标准输出的程序中是常见的一个功能。 61. [文件路径](61.file_paths.go) `filepath` 包为 *文件路径* 提供了方便的跨操作系统的解析和构建函数; 比如:Linux 下的 `dir/file` 和 Windows 下的 `dir.ile`。 62. [文件目录](62.directories.go) 63. [临时文件和目录](63.temporary_files_and_directories.go) 64. [测试](64.main_test.go) 想要写出好的 Go 程序,**单元测试** 是很重要的一部分。  `testing` 包为提供了编写单元测试所需的工具,写好单元测试后,我们可以通过 `go test` 命令运行测试。 65. [命令行参数 Arguments](65.command_line_arguments.go) *命令行参数* 是指定程序运行参数的一个常见方式。 例如:`go run hello.go`, 程序 `go` 使用了 `run` 和 `hello.go` 两个参数。 66. [命令行标志 Flags](66.command_line_flags.go) *命令行标志* 是命令行程序指定选项的常用方式。例如,在 `wc -l` 中, 这个 `-l` 就是一个命令行标志。 67. [命令行子命令 Subcommands](67.command_line_subcommands.go) `go` 和 `git` 这种命令行工具,都有很多的 子命令。 并且每个工具都有一套自己的 `flag`,比如: `go build` 和 `go get` 是 `go` 里面的两个不同的子命令。 `flag` 包让我们可以轻松的为工具定义简单的子命令。 68. [环境变量](68.environment_variables.go) 69. [HTTP 客户端](69.http_clients.go) Go 标准库的 `net/http` 包为 HTTP 客户端和服务端提供了出色的支持。 70. [HTTP 服务器](70.http_servers.go) 使用 `net/http` 包,我们可以轻松实现一个简单的 HTTP 服务器。 71. [生成进程](71.spawning_processes.go) 72. [执行进程](72.execing_processes.go) 73. [信号](73.signals.go) 74. [退出](74.exit.go) 使用 `os.Exit` 来立即进行带给定状态的退出。