首页 > 其他分享 >go基本操作

go基本操作

时间:2024-07-03 16:28:31浏览次数:21  
标签:author db UserInfo go 基本操作 model gorm

1.go wsl环境搭建

注意事项:ubuntu必须安装在系统盘(C盘)

VSode插件下载:

koroFileHeader自动添加注释:VScode自动添加注释_vscode自动注释-CSDN博客

go中文下载地址:Go下载 - Go语言中文网 - Golang中文社区

golang开发环境下载:All releases - The Go Programming Language

go中文文档:Golang标准库中文文档

go version #查看go版本
go env #查看配置

2.gin框架

1.安装扩展
# 1.打开模板支持
go env -w GO111MODULE=on #-w是写的意思
# 2.设置国内代理
go env -w GOPROXY=https://goproxy.cn,direct
# 3.查看配置
go env
# 4.在GOPATH目录下建一个文件夹
go mod init goweb #建一个工程,生成go.mod文件
go mod tidy #加载模板文件
# 5.安装gin
go get -u github.com/gin-gonic/gin
# 6.安装gorm
#文档地址:https://gorm.io/zh_CN/docs/index.html
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
# 7.安装第三方日志库
go get github.com/sirupsen/logrus 
# 8.安装redis插件
go mod init github.com/my/repo
go get github.com/redis/go-redis/v9
# 9.安装jwt插件
go get github.com/dgrijalva/jwt-go
2.gin连接
func main() {
    r := gin.Default()
    r.Use(middleware.CrossMiddleware) //跨域请求中间件
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    s := &http.Server{
        Addr:         ":8080", //修改访问端口
        Handler:      r, //路由对象
        ReadTimeout:  10 * time.Second, //读取超时时间
        WriteTimeout: 5 * time.Second, //写超时时间
    }
    s.ListenAndServe()
    r.Run()
}
3.跨域请求
package middleware
// 解决跨域请求问题
func CrossMiddleware(ctx *gin.Context) {
    ctx.Header("Access-Control-Allow-Origin", "*") //允许跨域请求
    ctx.Next()
}

3.gorm基本操作

1.gorm连接
func Test(ctx *gin.Context) { 
    // 连接mysql [账号名]:[密码]@tcp([地址:端口]/[项目目录]?charset=[字符集]&parseTime=true&loc=Local)
    dsn := "root:123456@tcp(localhost:3306)/goweb?charset=utf8mb4&parseTime=True&loc=Local"
    // mysql相关配置
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            SingularTable: true, //关闭表名复数
        },
        // 全局日志 Silent:不展示日志 Error:报错 Warn:警告 Info:所有
        Logger: logger.Default.LogMode(logger.Info),
    })
    db.LogMode(true) //开启SQL日志
    
    sqlDB, err := db.DB()
    // 查看mysql状态
    sqlDB.Stats()
    // SetMaxIdleConns 设置空闲连接池中连接的最大数量
    sqlDB.SetMaxIdleConns(10)
    // SetMaxOpenConns 设置打开数据库连接的最大数量。
    sqlDB.SetMaxOpenConns(100)
    // SetConnMaxLifetime 设置了连接可复用的最大时间。
    sqlDB.SetConnMaxLifetime(time.Hour)
    // 关闭数据库连接
    defer sqlDB.Close() //defer sqlDB.Close()
}
2.增删改查
// 创建表模型
m := db.Migrator()
// 创建表
m.CreateTable(&User{})
// 自动迁移,结构体字段修改表也会跟着修改,结构体类型改变表不会改变
m.AutoMigrate(&model.Order{}, &model.UserInfo{})
// 插入数据
db.Create(&model.User{Name: "zhangsan", Age: 18, Sex: 1})
​
// 查询数据
var user model.User
db.First(&user, "name=?", "zhangsan")
fmt.Println(&user)
​
// 更新数据
db.First(&user, 1)
db.Model(&user).Update("name", "lisi")
​
// 删除数据
db.First(&user, 2)
db.Delete(&user)
​
// 删除表
m.DropTable("user")
m.DropTable(&User{})
​
// 判断表是否存在
bool := m.HasTable(&User{})
bool := m.HasTable("user")
3.结构体
// 表名为:db_user_info
type DBUserInfo struct {
    gorm.Model //自动添加时间变动字段
    Name string `form:"username" json:"username" binding:"required" comment:"用户名" gorm:"type:varchar(50);size:255;not null"` //size:字段长度; not null:非空
    Type uint8  `gorm:"index:type"` //index:普通索引 type:索引名称
    Mid  uint32 `gorm:"uniqueIndex"` //uniqueIndex:唯一性索引
}
// 自定义表名
func (DBUserInfo) TableName() string {
    return "test"
}
4.关系
属于:关系和外键在同一方,有关系的那一方属于另外一方的模型
包含:关系和外键不在同一方,有关系的那一方包含另外一方的模型
1.一对一关系
// 两边建立模型都没问题,尽量采用包含,在字段少的表建立模型
type Order struct {
    Id       uint32
    Desc     string
    UserInfo UserInfo `gorm:"ForeignKey:OrderId;AssociationForeignKey:Id"` //关系
    // UserInfoID int32    //默认关联字段
}
type UserInfo struct {
    Id      uint32
    Name    string
    Age     uint8
    OrderId uint32 //自定义关联字段
}
​
// 插入数据
oneToOne := model.Order{
    Desc: "扩展内容",
    UserInfo: model.UserInfo{
        Name: "名字",
        Age:  18,
    },
}
db.Create(&oneToOne)
​
// 查询数据
var oneToOneField model.Order
// 第一种方式
db.First(&oneToOneField, 1)
fmt.Println(&oneToOneField)
db.Model(&oneToOneField).Association("UserInfo").Find(&oneToOneField.UserInfo)
fmt.Println(oneToOneField)
//第二种方式(推荐使用)
db.Preload("UserInfo").Find(&oneToOneField, 2)
fmt.Println(oneToOneField)
​
// 更新数据
db.Preload("UserInfo").First(&oneToOneField, 1)
db.Model(&oneToOneField.UserInfo).Update("name", "zhangsan") //更新一个数据
db.Model(&oneToOneField.UserInfo).Updates(model.UserInfo{Name: "lisi", Age: 20}) //更新多个数据
​
// 删除数据
db.Preload("UserInfo").First(&oneToOneField, 1)
db.Debug().Delete(&oneToOneField.UserInfo)
2.一对多关系
// 一对多关系,要在一这方建立好模型
type Author struct {
    Id      uint32
    Name    string
    Age     uint8
    Article []Article `gorm:"ForeignKey:AuthorId;AssociationForeignKey:Id"` //关系
}
type Article struct {
    Id       uint32
    Title    string
    KeyWord  string
    Content  string
    AuthorId uint32 //自定义关联字段
}
// 插入数据
// 第一种方式(推荐使用)
author := model.Author{
    Name: "姓名",
    Age:  20,
    Article: []model.Article{{Title:   "文章标题1",KeyWord: "关键词1",Content: "内容1",},{Title:   "文章标题2",KeyWord: "关键词2",Content: "内容2",},},
}
db.Create(&author)
​
// 第二种方式,不会重复插入同一条数据
author := model.Article{Title: "文章标题3", KeyWord: "关键词3", Content: "内容3"}
db.Create(&author)
article := model.Author{
    Name: "姓名2",
    Age:  23,
    Article: []model.Article{
        author,
    },
}
db.Create(&article)
​
// 查询数据
var author model.Author
// 第一种方式(推荐使用)
db.Preload("Article").Find(&author, 1)
fmt.Println(author)
// 第二种方式
db.First(&author, 1)
db.Model(&author).Association("Article").Find(&author.Article)
fmt.Println(author)
​
// 更新数据
db.Preload("Article").Find(&author, 1)
db.Model(&author.Article).Where("id = ?", 1).Update("title", "标题")
​
// 删除数据
db.Preload("Article").Find(&author, 1)
db.Where("id = ?", 1).Delete(&author.Article)
3.多对多关系
// 多对多关系
type Articles struct {
    Id      int32
    Title   string
    KeyWord string
    Content string
    Tags    []Tag `gorm:"many2many:ArticlesTag;ForeignKey:Id;AssociationForeign:Id"`
}
type Tag struct {
    Id   int32
    Name string
}
​
// 插入数据
// 第一种
articles := model.Articles{
    Title:   "手机",
    KeyWord: "手机标签",
    Content: "关于手机的内容",
    Tags: []model.Tag{
        {Name: "手机1"},
        {Name: "手机2"},
    },
}
db.Create(&articles)
// 第二种
var tag model.Tag
db.First(&tag, 2)
articles := model.Articles{
    Title:   "手机3",
    KeyWord: "手机标签3",
    Content: "关于手机的内容3",
    Tags: []model.Tag{
        tag,
    },
}
db.Create(&articles)
​
// 查询
// 第一种
var articles model.Articles
db.Preload("Tags").Find(&articles, 1)
fmt.Println(articles)
// 第二种
db.First(&articles, 1)
db.Model(&articles).Association("Tags").Find(&articles.Tags)
fmt.Println(articles)
​
// 更新
var articles model.Articles
db.Preload("Tags").Find(&articles, 1)
db.Model(&articles.Tags).Where("id = ?", 1).Update("name", "手机标签")
5.查询
var user User
res := db.Where("name = ?", "zhangsan").Find(&user)
fmt.Println(&user) //查询结果
fmt.Println(res.RowsAffected) //影响行数
fmt.Println(res.Error) //报错信息
errs := result.GetErrors() //获取所有错误信息
for _, err := range errs {
    fmt.Println(err) //打印所有报错信息
}

4.go-redis

1.redis连接
rdb := redis.NewClient(&redis.Options{
    Addr:     "localhost:6379",
    Password: "", //没有密码,默认值
    DB:       0,  //默认DB0
})
2.redis配置
3.string类型
err := rdb.Set("key", "value", 0).Err() //set新增操作
val, err := rdb.Get("key").Result() //get获取操作
nums := rdb.Incr("member:auto_increment").Val() //自增操作,返回自增后的累加值

99.常见问题

1.$GOPATH/go.mod exists but should not
# 修改完配置记得重新打开vscode
有GOPATH就不用设置gomod,因为这两个都是用来管理项目,gomod是后来新版本的项目管理方式,很多旧资料上还是使用了GOPATH,所以出现这个问题,只需要把环境变量删除即可
unset GOPATH
vim /etc/profile
source /etc/profile
2.warning: go env -w GO111MODULE=... does not override conflicting OS environment variable

代表GO111MODULE已经有值了,不允许修改

3.引入包飘红

打开项目所在的文件夹

4.引用模板报错

panic: html/template: pattern matches no files: `template/*`

echo $GOPATH #查看环境变量是否正确
unset GOPATH #删除环境变量
vim /etc/profile #修改环境变量
source /etc/profile #生效配置
go run main.go #在main目录下运行
5.vscode包没有自动导入的原因

方法字母设置成小写,没有权限访问

6.gorm绑定表字段缺失

结构体字段名是否大写

7.gorm关联表未成功
m.AutoMigrate(&model.Order{}, &model.UserInfo{}) //顺序是否填对,模型要在前面,模型就是有带关系的结构体,外键的字段类型是否与关联表的主键一致
8.go: go.mod file not found in current directory or any parent directory.
go env -w GO111MODULE=auto
9.main.go:4:2: no required module provides package github.com/gin-gonic/gin; to add it: go get github.com/gin-gonic/gin
go mod init [main] //执行过则跳过 main项目名称
go get -u github.com/gin-gonic/gin
10.main.go:5:2: package object/router is not in GOROOT (E:\ProgramFiles\SDK\go\src\object\router)
// 导入包时的路径名字需与go.mod文件里面的module object一致
go mod init main.go
go mod tidy
11.fatal: unable to access 'GitHub - grpc/grpc-go: The Go language implementation of gRPC. HTTP/2 based RPC': Failed to connect to github.com port 443 after 21088 ms: Timed out
git config --global --unset http.proxy
git config --global --unset https.proxy
12.github.com/google/go-cmp/cmp/cmpopts: github.com/beevik/[email protected]: Get "https://proxy.golang.org/github.com/beevik/etree/@v/v1.1.0.mod": dial tcp 172.217.160.81:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
go env -w GOPROXY=https://goproxy.cn,direct
# GOPROXY=https://proxy.golang.org,direct
13.# command-line-arguments
.\main.go:12:110: undefined: syscall.SIGUSR1
// 修改外部库 Go\src\syscall\types_windows.go 文件
​
var signals = [...]string{
    // 这里省略N行。。。。
​
    /** 兼容windows start */
    16: "SIGUSR1",
    17: "SIGUSR2",
    18: "SIGTSTP",
    /** 兼容windows end */
}
​
/** 兼容windows start */
func Kill(...interface{}) {
    return;
}
const (
    SIGUSR1 = Signal(0x10)
    SIGUSR2 = Signal(0x11)
    SIGTSTP = Signal(0x12)
)
/** 兼容windows end */
14.本地能访问,wsl访问不了

1.打开Windows设置->更新与安全->Windows安全中心->防火墙和网络保护->高级设置->入站规则->新建->自定义->所有程序->下一步->作用域->下列ip地址 点击添加 加Ubuntu地址跟本地地址

标签:author,db,UserInfo,go,基本操作,model,gorm
From: https://blog.csdn.net/zgf2546/article/details/140134867

相关文章

  • Golang面试:泛型
    Go语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。1.泛型的基本概念泛型允许你定义可以处理多种数据类型的函数和数据结构,而无需......
  • Gitblit的基本操作和技巧
    Gitblit是一个开源的、轻量级的Git服务器,使用Java编写,能够提供简单的Web界面来浏览Git仓库、管理用户和仓库权限,以及进行一些基本的Git操作。安装时最重要的是配置gitblit.properties文件以自定义Gitblit的行为,例如更改端口、设置HTTPS。如果不要求严格的认证,最好同时设置http......
  • Golang开发:构建支持并发的网络爬虫
    Golang开发:构建支持并发的网络爬虫随着互联网的快速发展,获取网络数据成为了许多应用场景中的关键需求。网络爬虫作为一种自动化获取网络数据的工具,也因此迅速崛起。而为了应对日益庞大的网络数据,开发支持并发的爬虫成为了必要的选择。本文将介绍如何使用Golang编写一个支持......
  • Django 自定义用户表
    当默认的用户表中字段不足以满足我们的业务需求时,可以自己继承和重写用户表,增加想要的字段。1.自定义用户表模型fromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportAbstractUser#重新定义用户表classUserProfile(AbstractUser):avatar=model......
  • django使用jinja2模板
    1.使用Django默认模板TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[BASE_DIR/'templates'],#使用路径表达式'APP_DIRS':True,'OPTIO......
  • excel基本操作:基础、数据条件格式、快捷键
    Excel有三个模式分别是选择模式、编辑模式和输入模式(有光标)=====》这些了解就够了,也是最基本的。1.快捷键:ctrl+shift+右三角   选择所有的直到右边没有空格的在体重的那个空格选择的时候,按住上面的组合键就会出现从体重那一列直到球员奖金那一列在按住ctrl+shift+下就......
  • 差异基因富集分析(R语言——GO&KEGG&GSEA)
    接着上次的内容,上篇内容给大家分享了基因表达量怎么做分组差异分析,从而获得差异基因集,想了解的可以去看一下,这篇主要给大家分享一下得到显著差异基因集后怎么做一下通路富集。1.准备差异基因集我就直接把上次分享的拿到这边了。我们一般都把差异基因分为上调基因和下调基因分......
  • 前端视角下的Go语法学习:demo-crud 实现增删改查
    今日话题基于go+gin实现增删改查,仅仅只是提供接口不涉及数据库增删改查作者:云层上的光时间:2024年6月22日10时15分14秒主线任务一、项目创建1、创建demo-crud文件夹2、编辑器打开demo-crud项目,提示设置gosdk,这里我设置了1.22.43、声明go.mod文件go......
  • Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire
    一、前言线上项目往往依赖非常多的具备特定能力的资源,如:DB、MQ、各种中间件,以及随着项目业务的复杂化,单一项目内,业务模块也逐渐增多,如何高效、整洁管理各种资源十分重要。本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构&DDD等设计思想的落地,起到的支撑作用。......
  • Google 发布了最新的开源大模型 Gemma 2,本地快速部署和体验
    Gemma2是Google最新发布的开源大语言模型。它有两种规模:90亿(9B)参数和270亿(27B)参数,分别具有基础(预训练)和指令调优版本,拥有8KTokens的上下文长度:Gemma-2-9b:90亿参数基础模型版本Gemma-2-9b-it:90亿参数基础模型的指令调优版本Gemma-2-27B:270亿参数基础模型版本G......