设计模式之 Database/SQL 与 GORM 实践 | 青训营笔记

137 阅读2分钟

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

image.png

程序由上而下有这些层次:业务代码,SDK,基础库,语言运行时,OS 性能优化的两个角度

  • 业务层优化 :针对特定场景,具体问题具体分析,容易获得较大性能收益
  • 语言运行时优化:解决更通用的性能问题,tradeoff

Go SDK

image.png 确保Go SDK软件质量,可维护性的手段:

  1. 保证接口稳定的前提下改进具体实现
  2. 测试用例:覆盖尽可能多的场景
  3. 写好说明文档
  4. 隔离:通过选项控制是否开启优化
  5. 可观测:必要的日志输出,使用者可以看到运行情况

01 自动内存管理

  • 动态内存:程序在运行时根据需求动态分配的内存: malloc()
  • 自动内存管理:由程序语言的运行时系统管理动态内存
  • 避免手动内存管理,专注于实现业务逻辑
  • 保证内存使用的正确性安全性: double-free problem, use-after-free problem
  • 三个任务

    • 为新对象分配空间
    • 找到存活对象
    • 回收死亡对象的内存空间


作者:青训营官方账号
链接:juejin.cn/post/709597… 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

collectors 需要感知对象指向关系的改变,从而正确标记所有存活的对象。

image.png

02 Go内存管理及优化

03 编译器和静态分析

04 Go 编译器优化

设计模式之 Database/SQL 与 GORM 实践

理解 database/sql

基本用法

import (
    "database/sql"//这个包里有连接池,一些接口用于连接数据库和操作数据库
    _"github.com/go-sql-driver/mysql"
)

func main(){
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")
    rows, err := db.Query("select id, name from users where id = ?", 1)
    if err != nil{
    //xxx
    }
    defer row.Close()
    
    var users []User
    for rows.Next(){
        vae user User
        err := rows.Scan(&user.ID, &user.Name)
        
        if errr != nil{
            // ...
        }
        
        users = append(users, user)
    }
    
    if rows.Err() != nil{
    //...
    }
    //早年的用法:注册Driver,是一个连接接口
    func init(){
    sql.Register("mysql", &MySQLDriver{})
    }
}

新的接口Connector,传入一个interface,返回一个db

image.png image.png 用法: image.png

GORM 使用简介

GORM 是什么?一种简洁,强大的ORM(ORM 是用元数据描述对象与关系映射的细节的框架,轮子)。 基本用法:

import (
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
)

func main(){
    db, err := gorm.Open(
        mysql.Open("user:password@tcp(127.0.0.1:3306)/hello")
    )
    
    var users []User
    err = db.Select("id","name").Find(&users, 1).Error
}

GORM 设计原理

image.png

image.png

ConnPool

Dialector

GORM 实践