Golang入门与实践 | 青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第 1 篇笔记
1. 语言基础
几个golang特有的语法和特性
-
Slice(切片):代表变长的序列,序列中每个元素都有相同的类型。slice的语法和数组很像,只是没有固定的长度而已。
slice的底层引用一个数组对象,一个slice由三个部分构成:指针,长度和容量。
多个slice之间可以共享底层的数据,并且引用的数据部分区间有可能重叠。
-
Goroutines:Go语言的并发是基于
goroutine的,goroutine类似于线程,但并非线程。可以将goroutine理解为一种虚拟线程。Go 语言运行时会参与调度goroutine,并将goroutine合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine。特点:
goroutine具有可增长的分段堆栈。这意味着它们只在需要时才会使用更多内存。goroutine的启动时间比线程快。goroutine原生支持利用channel安全地进行通信。goroutine共享数据结构时无需使用互斥锁
-
Channels:如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特殊的类型,也就是channels可发送数据的类型。一个可以发送int类型数据的channel一般写为chan int。
2. gin框架
-
Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。 -
快速开始:
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. 开发者友好
-
连接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() }
-
一般查询
// 根据主键查询第一条记录 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;
-
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';
\