For-learning-Go-Tutorial

Go语言各种值类型,包括字符串、整数、浮点数、布尔值等。下面是一些基本示例。

Go语言最主要的特性:

  • 自动垃圾回收
  • 更丰富的内置类型
  • 函数多返回值
  • 错误处理
  • 匿名函数和闭包
  • 类型和接口
  • 并发编程
  • 反射
  • 语言交互性

Go语言案例总结

最近一直在写一部针对初入门Golang开发人员的书,我觉得最好的状态就是学习了基础之后,练习,然后做项目中不断的提高!

GO 例子目录:

Go数组

  • 数组是一个具有相同数据类型的元素组成的固定长度的有序集合。
  • 在Go语言中,数组是值类型,长度是类型的组成部分,也就是说”[10]int”和“[20]int”是完全不同的两种数组类型。
  • 同类型的两个数组支持”==”和”!=”比较,但是不能比较大小。
  • 数组作为参数时,函数内部不改变数组内部的值,除非是传入数组的指针。
  • 数组的指针:*[2,3,4]int
  • 指针数组:[3]*int
  1. package main
  2. import "fmt"
  3. func main() {
  4. // 这里我们创建了一个具有5个元素的整型数组
  5. // 元素的数据类型和数组长度都是数组的一部分
  6. // 默认情况下,数组元素都是零值
  7. // 对于整数,零值就是0
  8. var a [5]int
  9. fmt.Println("emp:", a)
  10. // 我们可以使用索引来设置数组元素的值,就像这样
  11. // "array[index] = value" 或者使用索引来获取元素值,
  12. // 就像这样"array[index]"
  13. a[4] = 100
  14. fmt.Println("set:", a)
  15. fmt.Println("get:", a[4])
  16. // 内置的len函数返回数组的长度
  17. fmt.Println("len:", len(a))
  18. // 这种方法可以同时定义和初始化一个数组
  19. b := [5]int{1, 2, 3, 4, 5}
  20. fmt.Println("dcl:", b)
  21. // 数组都是一维的,但是你可以把数组的元素定义为一个数组
  22. // 来获取多维数组结构
  23. var twoD [2][3]int
  24. for i := 0; i < 2; i++ {
  25. for j := 0; j < 3; j++ {
  26. twoD[i][j] = i + j
  27. }
  28. }
  29. fmt.Println("2d: ", twoD)
  30. }

输出结果为:

  1. emp: [0 0 0 0 0]
  2. set: [0 0 0 0 100]
  3. get: 100
  4. len: 5
  5. dcl: [1 2 3 4 5]
  6. 2d: [[0 1 2] [1 2 3]]

拥有固定长度是数组的一个特点,但是这个特点有时候会带来很多不便,尤其在一个集合元素个数不固定的情况下。这个时候我们更多地使用切片。

map

map是Go语言内置的关联数据类型。因为数组是索引对应数组元素,而字典是键对应值。

  1. package main
  2. import "fmt"
  3. func main() {
  4. // 创建一个字典可以使用内置函数make
  5. // "make(map[键类型]值类型)"
  6. m := make(map[string]int)
  7. // 使用经典的"name[key]=value"来为键设置值
  8. m["k1"] = 9
  9. m["k2"] = 22
  10. // 用Println输出字典,会输出所有的键值对
  11. fmt.Println("map:", m)
  12. // 获取一个键的值 "name[key]".
  13. v1 := m["k1"]
  14. fmt.Println("v1: ", v1)
  15. // 内置函数返回字典的元素个数
  16. fmt.Println("len:", len(m))
  17. // 内置函数delete从字典删除一个键对应的值
  18. delete(m, "k2")
  19. fmt.Println("map:", m)
  20. // 根据键来获取值有一个可选的返回值,这个返回值表示字典中是否
  21. // 存在该键,如果存在为true,返回对应值,否则为false,返回零值
  22. // 有的时候需要根据这个返回值来区分返回结果到底是存在的值还是零值
  23. // 比如字典不存在键x对应的整型值,返回零值就是0,但是恰好字典中有
  24. // 键y对应的值为0,这个时候需要那个可选返回值来判断是否零值。
  25. _, ok := m["k2"]
  26. fmt.Println("ok:", ok)
  27. // 可以用 ":=" 同时定义和初始化一个字典
  28. n := map[string]int{"foo": 1, "bar": 2}
  29. fmt.Println("map:", n)
  30. }

输出结果为:

  1. map: map[k1:9 k2:22]
  2. v1: 9
  3. len: 2
  4. map: map[k1:9]
  5. ok: false
  6. map: map[foo:1 bar:2]

Go函数定义

函数是Go语言的重要内容。

  1. package main
  2. import "fmt"
  3. // 这个函数计算两个int型输入数据的和,并返回int型的和
  4. func plus(a int, b int) int {
  5. // Go需要使用return语句显式地返回值
  6. return a + b
  7. }
  8. func main() {
  9. // 函数的调用方式很简单
  10. // "名称(参数列表)"
  11. res := plus(1, 2)
  12. fmt.Println("1+2 =", res)
  13. }

输出结果为:

  1. 1+2 = 3

Go方法

通常的函数定义叫做函数,定义在结构体上面的函数叫做该结构体的方法。 从某种意义上说,方法是函数的“语法糖”。当函数与某个特定的类型绑定,那么它就是一个方法。也证因为如此,我们可以将方法“还原”成函数。

  1. package main
  2. import "fmt"
  3. type rect struct {
  4. width, height int
  5. }
  6. // 这个area方法有一个限定类型*rect,
  7. // 表示这个函数是定义在rect结构体上的方法
  8. func (r *rect) area() int {
  9. return r.width * r.height
  10. }
  11. // 方法的定义限定类型可以为结构体类型
  12. // 也可以是结构体指针类型
  13. // 区别在于如果限定类型是结构体指针类型
  14. // 那么在该方法内部可以修改结构体成员信息
  15. func (r rect) perim() int {
  16. return 2*r.width + 2*r.height
  17. }
  18. func main() {
  19. r := rect{width: 10, height: 5}
  20. // 调用方法
  21. fmt.Println("area: ", r.area())
  22. fmt.Println("perim:", r.perim())
  23. // Go语言会自动识别方法调用的参数是结构体变量还是
  24. // 结构体指针,如果你要修改结构体内部成员值,那么使用
  25. // 结构体指针作为函数限定类型,也就是说参数若是结构体
  26. //变量,仅仅会发生值拷贝。
  27. rp := &r
  28. fmt.Println("area: ", rp.area())
  29. fmt.Println("perim:", rp.perim())
  30. }

输出结果为:

  1. area: 50
  2. perim: 30
  3. area: 50
  4. perim: 30

Go结构体