Golang入门与实践 | 青训营笔记

156 阅读3分钟

Golang入门与实践 | 青训营笔记

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 1 篇笔记


1. 语言基础

几个golang特有的语法和特性

  1. Slice(切片):代表变长的序列,序列中每个元素都有相同的类型。slice的语法和数组很像,只是没有固定的长度而已。

    slice的底层引用一个数组对象,一个slice由三个部分构成:指针,长度和容量。

    多个slice之间可以共享底层的数据,并且引用的数据部分区间有可能重叠。

  1. Goroutines:Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go 语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine

    特点:

    1. goroutine具有可增长的分段堆栈。这意味着它们只在需要时才会使用更多内存。
    2. goroutine的启动时间比线程快。
    3. goroutine原生支持利用channel安全地进行通信。
    4. goroutine共享数据结构时无需使用互斥锁
  2. Channels:如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特殊的类型,也就是channels可发送数据的类型。一个可以发送int类型数据的channel一般写为chan int。

2. gin框架

  1. Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。

  2. 快速开始:

    package main
    // 获取gin
    import "github.com/gin-gonic/gin"// 主函数
    func main() {
      // 取r是router的缩写
        r := gin.Default()
      // 这里非常简单,很像deno、node的路由吧
        r.GET("/", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })
        // 监听端口8080
        r.Run(":8080")
    }
    

3. Gorm框架

gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。

它有以下的优点:1. 全功能ORM(无限接近)2. 关联 3. 钩子函数Hook 4. 预加载 5. 事务 6. 复合主键 7. sql生成器 8. 数据库自动迁移 9. 自定义日志 10. 可拓展性,可基于GORM回调编写插件 11. 所有功能都被测试覆盖 12. 开发者友好

  1. 连接mysql

    import (
      "github.com/jinzhu/gorm"
      _ "github.com/jinzhu/gorm/dialects/mysql"
    )
    ​
    func main() {
      db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
      defer db.Close()
    }
    
  1. 一般查询

    // 根据主键查询第一条记录
    db.First(&user)
    //// SELECT * FROM users ORDER BY id LIMIT 1;// 随机获取一条记录
    db.Take(&user)
    //// SELECT * FROM users LIMIT 1;// 根据主键查询最后一条记录
    db.Last(&user)
    //// SELECT * FROM users ORDER BY id DESC LIMIT 1;// 查询所有的记录
    db.Find(&users)
    //// SELECT * FROM users;// 查询指定的某条记录(仅当主键为整型时可用)
    db.First(&user, 10)
    //// SELECT * FROM users WHERE id = 10;
    
  1. where条件查询

    // Get first matched record
    db.Where("name = ?", "jinzhu").First(&user)
    //// SELECT * FROM users WHERE name = 'jinzhu' limit 1;
    ​
    // Get all matched records
    db.Where("name = ?", "jinzhu").Find(&users)
    //// SELECT * FROM users WHERE name = 'jinzhu';
    ​
    // <>
    db.Where("name <> ?", "jinzhu").Find(&users)
    //// SELECT * FROM users WHERE name <> 'jinzhu';
    ​
    // IN
    db.Where("name IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
    //// SELECT * FROM users WHERE name in ('jinzhu','jinzhu 2');
    ​
    // LIKE
    db.Where("name LIKE ?", "%jin%").Find(&users)
    //// SELECT * FROM users WHERE name LIKE '%jin%';
    ​
    // AND
    db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
    //// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;
    ​
    // Time
    db.Where("updated_at > ?", lastWeek).Find(&users)
    //// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';
    ​
    // BETWEEN
    db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
    //// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';
    

\