go-gin学习笔记

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包管理
  1. cmd 中运行命令

    go env -w GO111MODULE=on
    
  2. go get 下载包

  3. 下载后的包在 C:\Users\Administrator\go\pkg\mod

  4. 把包复制到 C:\Users\Administrator\go\src 目录中即可使用

go mod 包管理
  1. 初始化go.mod
go mod init [name]
  1. 引入自定义包

    // [name]/router -> go.mod init时的name,router是目录名
    import (
    	[name]/router
    )
    
    func main() {
        // rou是包名
    	rou.Request()
    }
    
  2. 运行后会自动生成 go.sum 文件

bee 脚手架
bee new [name]
gin脚手架
git clone [email protected]: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()
	}
}

你可能感兴趣的:(golang,学习)