Golang 标准命令: |
---|
go run xxx :编译程序并运行 |
go build xxx :编译包,生成exe 可执行文件 |
go install xxx :编译程序,(下载第三方包时,可以编译手动下载的包) |
go env :打印Go语言的环境信息 |
go version:打印Go语言的版本信息 |
go clean:消除go命令遗留的命令和文件 |
go list:打印当前包信息 |
下载第三方包时的参数: go get xxx |
---|
-x:打印全部信息 |
-d:下载不安装 |
-u:更新已有包 |
-f:与-u一起使用,更新包,忽略已有包 |
-fix:先修正包,再安装 |
-t:下载包时同时下载依赖包 |
系统变量:获取和设置
path=C:\Go;C:\Go\bin
GOROOT=C:\Go
GOPATH=C:\gopath;F:\go
set GOPATH=C:\gopath;F:\go
Walk:用户界面,用于桌面GUI的开发
- go get -x github.com/akavel/rsrc
- go get -x github.com/lxn/win
- go get -x github.com/lxn/walk
fyne:Go
中基于Material Design 跨平台GUI
- go get -x github.com/fyne-io/fyne
- go get -x fyne.io/fyne
gowd
:用户界面,使用GO和HTML / JS
/ CSS
构建跨平台的GUI应用
- go get -x github.com/dtylman/gowd
beego:web
开发框架
- go get -x github.com/beego/bee
- go get -x github.com/astaxie/beego
*Gin:Go(Golang)
编写的Web框架
- go get -x github.com/gin-gonic/gin
- go get -x github.com/go-playground/locales (依赖包)
- go get -x github.com/golang/protobuf/proto (依赖包)
*数据库驱动
- go get -x github.com/mattn/go-sqlite3
- go get -x github.com/mikespook/mymysql
- go get -x github.com/go-sql-driver/mysql
- go get -x github.com/jinzhu/gorm // gorm: 数据库操作
packr
:打包机,将静态文件嵌入Go二进制文件
- go get -x github.com/gobuffalo/packr
*goquery
:爬虫
- go get -x github.com/PuerkitoBio/goquery
- go get -x golang.org/x/net/html (依赖包)
captcha
:图像和音频验证码的生成和验证
- go get -x github.com/dchest/captcha
编写验证码(支持中文验证码)
- go get -x github.com/hanguofeng/gocaptcha
json
解析
- go get -x github.com/thedevsaddam/gojsonq
unioffice
:出来wps
文档
go get -x github.com/unidoc/unioffice
包安装代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
go mod 问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZUljCJh-1661838362952)(F:\1笔记\04.笔记整理\upload\image-20201219221501672.png)]
使用代理下载安装包
go path包管理
-
cmd 中运行命令
go env -w GO111MODULE=on
-
go get 下载包
-
下载后的包在
C:\Users\Administrator\go\pkg\mod
中 -
把包复制到
C:\Users\Administrator\go\src
目录中即可使用
go mod 包管理
- 初始化go.mod
go mod init [name]
-
引入自定义包
// [name]/router -> go.mod init时的name,router是目录名 import ( [name]/router ) func main() { // rou是包名 rou.Request() }
-
运行后会自动生成
go.sum
文件
bee 脚手架
bee new [name]
gin脚手架
git clone git@github.com:sqrtcat/easy-gin.git
踩坑记录
// defer 是在一个函数return之后执行
defer db.Close()
// 结构体
type User struct {
Id int // 能返回数据
name string // 返回为空
}
当一个结构体的名称为大写时才能在包中任意使用
当一个结构体的字段名为大写时才能在其他地方中获取到
当做web服务 使用到结构体时,字段名大写才能返回数据
全局变量
package [name]
当在同一目录下的不同包中定义的同一包名,某一包中的全局变量就是相同包名的全局变量
比如:当在 test1.go 中
package test
,test2.go 中package test
,全局变量公用
test1.go
package test
var global = "123"
test2.go
package test
func Test1(){
fmt.Println(global)
}
test3.go
package test
func Test2(){
fmt.Println(global)
}
Gin
获取参数
// post
message := c.PostForm("message")
// get
lastname := c.Query("lastname")
main.go
package main
import (
"io"
"os"
router "web-server/router"
"github.com/gin-gonic/gin"
)
// main 入口
func main() {
// 创建记录日志的文件
f, _ := os.Create("web.log")
gin.DefaultWriter = io.MultiWriter(f)
// 创建路由
r := gin.Default()
r.Static("/assets", "../assets")
// 记录日志
gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) {}
// adminapi 管理员
var adminapi = r.Group("/admin")
{
// 登录
adminapi.POST("/login", router.Login)
}
r.Run(":6061")
}
router / router.go
package router
import (
"net/http"
"strconv"
"time"
util "web-server/tool"
"github.com/gin-gonic/gin"
)
// Login 登录
/**
time: 2021年1月18日17:47:46
@username 账号
@password 密码
**/
func Login(res *gin.Context) {
// 接收参数
username := res.PostForm("username")
password := res.PostForm("password")
res.JSON(http.StatusOK, gin.H{
"code": 200,
"id": 1,
"data": result,
"msg": "登录成功",
})
}
database / mysql.go
package mysql
import (
"database/sql"
"fmt"
"strings"
util "web-server/tool"
_ "github.com/go-sql-driver/mysql"
)
//数据库的基础信息
const (
userName = "xxxxxx" // 连接名称
password = "xxxxxx" // 连接密码
ip = "web" // 连接地址
port = "3306" // 端口号
dbName = "web" // 数据库名称
)
// Connection 连接数据库
func Connection() *sql.DB {
// 连接参数
path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
// 打开数据库
db, _ := sql.Open("mysql", path)
// defer在return时就会执行,所有连接数据库的操作不需要执行close
// defer db.Close()
// 设置最大连接数和最大闲置连接数
db.SetMaxIdleConns(20)
db.SetMaxOpenConns(20)
// 测试连接
err := db.Ping()
util.Errors(err)
fmt.Println("数据库连接成功")
return db
}
跨域
package api
import (
"net/http"
"github.com/gin-gonic/gin"
)
// Cors 跨域
func Cors() gin.HandlerFunc {
return func(res *gin.Context) {
method := res.Request.Method
res.Header("Access-Control-Allow-Origin", "*")
res.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
res.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
res.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
res.Header("Access-Control-Allow-Credentials", "true")
//放行所有OPTIONS方法
if method == "OPTIONS" {
res.AbortWithStatus(http.StatusNoContent)
}
// 处理请求
res.Next()
}
}