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