网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。

go语言简介

2020-06-10 04:06:13 admin 1313

1 基础知识

go语言有以下特点:

  • 编译型语言,编译速度快

  • 静态类型语言,拥有动态类型语言特点

  • 类c语法,简单易学

  • 支持gc

  • 语言层面支持并发

  • 跨平台编译

2 著名的go项目:

  • docker:开源的应用容器引擎

  • kubernetes:一个开源的,用于管理云平台中多个主机上的容器化的应用

  • etcd:用于可靠地存储集群的配置数据的一种持久性,轻量型的,分布式的键-值数据存储系统

  • gogs:一款极易搭建的自助git服务

  • beego:一个快速开发go应用的http框架

hellow world:

__

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("Hello, world!")
  5. }

3 简单的go demo:

__

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func demo(i int) {
  7. fmt.Printf("demo%d\n", (i))
  8. }
  9. func main() {
  10. num := 1
  11. fmt.Println(num)
  12. str := "string"
  13. fmt.Println(str)
  14. str = "new string"
  15. fmt.Println(str)
  16. var foo int
  17. foo = 123
  18. var bar int = 456
  19. fmt.Println(foo, bar)
  20. if foo == 123 {
  21. fmt.Println("foo is 123")
  22. }
  23. for i := 0; i< 3; i++ {
  24. fmt.Println(i)
  25. }
  26. for i := 0; i < 5; i++ {
  27. go demo(i)
  28. }
  29. time.Sleep(2 * time.Second)
  30. }

4 变量

  • 声明的变量必须使用(导入的包也必须使用)

  • 多个变量赋值

  • :=声明变量

__

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. var N int = 100
  6. // N := 100
  7. // var N int
  8. func main() {
  9. a, b := 1, 2
  10. fmt.Println(a, b)
  11. var num int
  12. num = 10
  13. fmt.Println(num)
  14. var test string = "test"
  15. fmt.Println(test)
  16. fmt.Println(N)
  17. }

5 函数

  • 支持多值返回,具名返回

  • 使用_丢弃返回值

  • 以大写字母开头包级别的函数供外部访问

__

  1. func log(message string) {
  2. }
  3. func add(a int, b int) (ret int) {
  4. return ret
  5. }
  6. func power(name string) (int, bool) {
  7. return 1, true
  8. }

6 结构体

  • 不支持重载

  • 通过组合实现继承

  • 没有构造函数

  • 可以匿名组合和具名组合

  • 使用new创建一个结构体指针

  • 大写字母开头的变量可以访问

__

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Demo1 struct {
  6. id int
  7. name string
  8. }
  9. type Demo struct {
  10. id int
  11. name string
  12. d1 Demo1
  13. // Demo1
  14. }
  15. func (d *Demo) change(name string) {
  16. d.name = name
  17. }
  18. func (d Demo) unchange(name string) {
  19. d.name = name
  20. }
  21. func main() {
  22. d := Demo{}
  23. fmt.Println(d)
  24. d.name = "demo1"
  25. fmt.Println(d)
  26. d.change("name2")
  27. fmt.Println(d)
  28. d.unchange("name3")
  29. fmt.Println(d)
  30. dptr := new(Demo)
  31. // dptr :=&Demo{}
  32. fmt.Println(dptr)
  33. dptr.name = "demo1"
  34. fmt.Println(dptr)
  35. dptr.change("name2")
  36. fmt.Println(dptr)
  37. dptr.unchange("name3")
  38. fmt.Println(dptr)
  39. d1 := Demo{1, "test", Demo1{}}
  40. fmt.Println(d1)
  41. println(d1.name)
  42. println(d1.d1.name)
  43. }

7 字典、数组和切片

  • 字典

__

  1. package main
  2. import "fmt"
  3. func main() {
  4. // d := make(map[string]int)
  5. // d := map[string]int{"1": 1, "2": 2}
  6. d := map[string]int{}
  7. d["1"] = 1
  8. d["2"] = 2
  9. d["3"] = 3
  10. for k, v := range d {
  11. fmt.Println(k, v)
  12. }
  13. v, exists := d["3"]
  14. fmt.Println(v, exists)
  15. }
  • 数组

__

  1. package main
  2. import "fmt"
  3. func main() {
  4. // s := [3]int{1, 2, 3}
  5. // s := [...]int{1, 2, 3}
  6. var s [3]int
  7. fmt.Println(len(s))
  8. fmt.Println(cap(s))
  9. s[0] = 0
  10. s[1] = 1
  11. s[2] = 2
  12. // s[3] = 4
  13. for idx, v := range s {
  14. fmt.Println(idx, v)
  15. }
  16. }
  • 切片

__

  1. package main
  2. import "fmt"
  3. func main() {
  4. // s := []int{0, 1, 2}
  5. var s []int
  6. s = make([]int, 3, 4)
  7. // s := make([]int, 3, 5)
  8. fmt.Println(len(s))
  9. fmt.Println(cap(s))
  10. s[0] = 0
  11. s[1] = 1
  12. s[2] = 2
  13. s = append(s, 3)
  14. for idx, v := range s {
  15. fmt.Println(idx, v)
  16. }
  17. fmt.Println(s[1:3])
  18. }

8 接口

  • 接口只声明,不实现

  • 实现多态

  • duck-typing:如果一个对象走路像鸭子,游泳也像鸭子,叫声也像鸭子,那么该对象就可以被称作为鸭子

__

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Square struct {
  6. a int
  7. }
  8. func (s *Square) Area() int {
  9. return s.a * s.a
  10. }
  11. func (s *Square) Perimeter() int {
  12. return s.a * 4
  13. }
  14. type Rectangle struct {
  15. a int
  16. b int
  17. }
  18. func (r *Rectangle) Area() int {
  19. return r.a * r.b
  20. }
  21. func (r *Rectangle) Perimeter() int {
  22. return (r.a + r.b) * 2
  23. }
  24. type Shaper interface {
  25. Area() int
  26. Perimeter() int
  27. }
  28. type AnyShape interface{}
  29. func main() {
  30. square := new(Square)
  31. square.a = 2
  32. rectangle := new(Rectangle)
  33. rectangle.a = 2
  34. rectangle.b = 3
  35. fmt.Println("(1) call struct method:")
  36. fmt.Println("square area is: ", square.Area())
  37. fmt.Println("rectangle area is: ", rectangle.Area())
  38. fmt.Println("\n(2) via interface:")
  39. var shape Shaper
  40. shape = square
  41. fmt.Println("square area is: ", shape.Area())
  42. shape = rectangle
  43. fmt.Println("rectangle area is: ", shape.Area())
  44. fmt.Println("\n(3) via empty interface:")
  45. var anyShape AnyShape
  46. anyShape = square
  47. fmt.Println("square area is: ", anyShape.(*Square).Area())
  48. anyShape = rectangle
  49. fmt.Println("rectangle area is: ", anyShape.(*Rectangle).Area())
  50. fmt.Println("\n(4) type assertions via switch:")
  51. switch shape := anyShape.(type) {
  52. case *Rectangle:
  53. fmt.Printf("shape type is: %T\n", shape)
  54. fmt.Println("rectangle area is: ", shape.Area())
  55. default:
  56. fmt.Printf("unknown type %T\n", shape)
  57. }
  58. fmt.Println("\n(5) type assertions via comma, ok pattern:")
  59. anyShape = rectangle
  60. if shape, ok := anyShape.(*Rectangle); ok {
  61. fmt.Printf("shape type is: %T\n", shape)
  62. fmt.Println("rectangle area is: ", shape.Area())
  63. } else {
  64. fmt.Printf("unknown type %T\n", shape)
  65. }
  66. }

9 包管理

  • go get: go get github.com/mattn/go-sqlite3

  • 大写字母开头的变量或者函数对外可见

  • 标准库结构

  • demo pkg

10 协程

一个简单的协程:

__

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. var (
  8. counter = 0
  9. lock sync.Mutex
  10. )
  11. func main() {
  12. for i := 0; i< 3; i++ {
  13. go incr()
  14. }
  15. time.Sleep(time.Millisecond * 10)
  16. }
  17. func incr() {
  18. lock.Lock()
  19. defer lock.Unlock()
  20. counter++
  21. fmt.Println(counter)
  22. }

使用通道进行协程间通信:

  • 通道支持select

  • 通道有类型

  • 通道大小

  • go确保任意时刻只有一个协程可以访问数据

__

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. c := make(chan int)
  8. for i := 0; i< 5; i++ {
  9. worker := &Worker{id: i}
  10. go worker.process(c)
  11. }
  12. for i := 0; i < 5; i++ {
  13. c <- i
  14. time.Sleep(time.Millisecond * 50)
  15. }
  16. }
  17. type Worker struct {
  18. id int
  19. }
  20. func (w *Worker) process(c chan int) {
  21. for i := 0; i < 5; i++ {
  22. data := <-c
  23. fmt.Printf("worker %d got %d\n", w.id, data)
  24. }
  25. }

next

  • python多进程之multiprocessing

  • python小技巧分享

转载文章,原文链接: go语言简介

关键字词go简介

分享到:

如需留言,请 登录,没有账号?请 注册

0 条评论 0 人参与

顶部 底部