go常见操作

1.Linux环境搭建

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

VSode插件下载:

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

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

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

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

1.检查go是否安装
go version #查看版本信息
go env #查看配置
2.卸载旧版本

采用apt-get install golang安装的通过如下命令卸载

apt-get remove golang-go
apt-get remove --auto-remove golang-go

通过wget命令安装的,则通过以下方式删除

# 删除go目录(使用go env查看GOROOT目录)
sudo rm -rf /usr/local/go
# 删除软链接
sudo rm -rf /usr/bin/go
3.下载
# 1.进入工作目录
cd /home
# 2.下载Golang压缩包,这边下载的版本是go1.22.5,系统是x86_64架构(不懂下载哪个包的可以看99.常见问题里面的第15条)
wget https://golang.google.cn/dl/go1.22.5.linux-amd64.tar.gz
# 3.解压缩包
tar -C /usr/local -zxvf go1.22.5.linux-amd64.tar.gz
# 4.进入.bashrc配置环境变量,添加到文件末尾即可
vim ~/.bashrc
export GOROOT=/usr/local/go #go安装目录
export GOPATH=/home/goproject #项目目录
export GOBIN=$GOPATH/bin #go运行文件
export PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH #配置环境变量
# 5.生效环境变量
source ~/.bashrc

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/etree@v1.1.0: 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地址跟本地地址

15.安装go遇到Linux 安装go遇到cannot execute binary file: Exec format error错误

安装go之前我们要确定我们要安装哪种版本的go,常见的版本有以下几种:

uname -a #查看系统架构
root@zgf:/home# uname -a #我的系统是x86_64下载amd64即可
Linux zgf 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
# go1.22.5.linux-386.tar.gz:32位Linux系统使用的
# go1.22.5.linux-amd64.tar.gz:64位Linux系统x86架构的64位扩展使用
# go1.22.5.linux-arm64.tar.gz:ARMv8系统使用
# go1.22.5.linux-armv6l.tar.gz:ARMv6系统使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值