go 常见外部包解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go 常见外部包解析相关的知识,希望对你有一定的参考价值。


go(五)

1、gorilla/mux
导入:

import "github.com/gorilla/mux"

gorilla/mux是一个强大的路由,小巧但是稳定高效,不仅可以支持正则路由还可以按照Method,header,host等信息匹配

使用示例:

r := mux.NewRouter()

//与http.ServerMux不同的是mux.Router是完全的正则匹配,设置路由路径/index/,如果访问路径/idenx/hello会返回404
//设置路由路径为/index/访问路径/index也是会报404的,需要设置r.StrictSlash(true), /index/与/index才能匹配
r.HandleFunc("/index/", func(w http.ResponseWriter, r *http.Request)
w.Write([]byte("root path"))
)

//mux.Vars(r)会返回该请求所解析出的所有参数(map[string]string)
//访问/hello/ghbai 会输出 hello ghbai
r.HandleFunc("/hello/name:[a-zA-Z]+", func(w http.ResponseWriter, r *http.Request)
w.Write([]byte(fmt.Sprintf("hello %s", mux.Vars(r)["name"])))
)

http.Handle("/", r)

在我接触的项目中,有这样的应用:

func (registry *MsgRegistry) RegisterHandlers(r *mux.Router) 
registerHandlers(r)

//其中registerHandlers方法为:
func registerHandlers(r *mux.Router)
glog.V(2).Info("register handlers")
registerHttpHandlers(r)
registerUserHandlers()

//在打开服务的时候调用了:
func (s *GameServer) StartServer(dispatcher MsgDispatcher)
s.dispatcher = dispatcher
r := mux.NewRouter()
http.Handle("/", r)
s.dispatcher.RegisterHandlers(r)
glog.Fatal(http.ListenAndServe(fmt.Sprintf("%v", bindHost), nil))

2、golang/glog
导入:

import "github.com/golang/glog"

glog是著名的google开源C++日志库glog的golang版本,glog是一个轻量级的日志库,上手简单不需要配置文件并且稳定高效,但是可以自定义控制的内容就少了。 glog主要有以下几个特点:

glog有四种日志等级INFO < WARING < ERROR < FATAL,不同等级的日志是打印到不同文件的,低等级的日志文件中(INFO)会包含高等级的日志信息(ERROR)
通过命令行传递参数 –log_dir指定日志文件的存放目录,默认为os.TempDir()
可以根据文件大小切割日志文件,但是不能根据日期切割日志文件
日志输出格式是固定的(Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg…)不可以自定义
在程序开始时需要调用flag.Parse()解析命令行参数,在程序退出时需要调用glog.Flush() 确保将缓存区中的内容输出到文件中。
使用示例:

func main() 
//初始化命令行参数
flag.Parse()

//退出时调用,确保日志写入文件中
defer glog.Flush()

glog.Info("hello, glog")
glog.Warning("warning glog")
glog.Error("error glog")

glog.Infof("info %d", 1)
glog.Warningf("warning %d", 2)
glog.Errorf("error %d", 3)

3、bson
示例:

package main

import (
"fmt"
"labix.org/v2/mgo/bson"
)
type TestStruct struct
Name string
ID int32

func main()
fmt.Println("start")
data, err := bson.Marshal(&TestStructName: "Bob")
if err != nil
panic(err)

fmt.Println("%q", data)
value := TestStruct
err2 := bson.Unmarshal(data, &value)
if err2 != nil
panic(err)

fmt.Println("value:", value)
mmap := bson.M
err3 := bson.Unmarshal(data, mmap)
if err3 != nil
panic(err)

fmt.Println("mmap:", mmap)

4、mgo
导入包:

import "gopkg.in/mgo.v2"

mgo这个包是go语言与mongodb交互的包。
连接mongodb:

session, err := mgo.Dial(url)

使用某个集合

c := session.DB(database).C(collection)

常用方法:
4.1、查找

type GameLog struct 
RoomId int `bson:"roomId"`
Status int `bson:"status"`
GameInfo UserGameInfoDB `bson:"gameInfo"`
DismissInfo DismissInfoDB `bson:"dismissInfo"`
CreateTime int64 `bson:"createTime"`

items := &GameLog
c.Find(bson.M"roomId": roomId).One(items)
//查找roomId字段为roomId(一个变量)的结果,输出到以GameLog格式的items变量中

4.2、更新并返回最新值

const (
userIdC = "user_id_index"
)
ch := mgo.Change
Update: bson.M"$inc": bson.M"seq": 1,
ReturnNew: true,


next := &sequence
err := util.WithUserCollection(userIdC, func(c *mgo.Collection) error
_, err := c.Find(bson.M"name": "index").Apply(ch, &next)
//err : not found
return err
)
//对user_id_index集合的seq字段加一,并返回最新值,seq为自增字段

4.3、插入数据

_, err := c.Upsert(bson.M"userName": u.UserName, u)

其中bson.M( Key : Value )的使用需要导入“gopkg.in/mgo.v2/bson”包。用于go的结构与Mongodb的集合进行转换。

注意事项
如果go需要连接到mongodb的多个数据库中,且多个数据库都有单独的认证用户,则需要单独写连接语句。

flag.StringVar(&dbUrl, "dburl", "mongodb://zhangliao:zhangLiao2018@127.0.0.1/poker_user", "db url.")
flag.StringVar(&dbgamedataUrl, "gamedataurl", "mongodb://zhangliao:zhangLiao2018@127.0.0.1/gamedata", "gamedata url.")
flag.StringVar(&logDbUrl, "logurl", "mongodb://zhangliao:zhangLiao2018@127.0.0.1/poker_log", "log url.")

func getSession() *mgo.Session
if mgoSession == nil
var err error
mgoSession, err = mgo.Dial(dbUrl)
if err != nil
panic(err)

mgoSession.SetPoolLimit(dbPoolLimit)

return mgoSession.Clone()




func getLogSession() *mgo.Session
if logSession == nil
var err error
logSession, err = mgo.Dial(logDbUrl)
if err != nil
panic(err)

logSession.SetPoolLimit(dbPoolLimit)

return logSession.Clone()


func getJavaSession() *mgo.Session
if gamadataSession == nil
var err error
gamadataSession, err = mgo.Dial(dbgamedataUrl)
if err != nil
panic(err)

gamadataSession.SetPoolLimit(dbPoolLimit)

return gamadataSession.Clone()

否则会报没有权限执行相关命令的错误。
5、mysql
导入:

import _ "github.com/go-sql-driver/mysql"
import "database/sql"

mysql包是go与mysql类数据库(mysql,mariadb等)交互的数据库驱动包
连接示例

db, err := sql.Open("mysql", "zhangliao:zhangLiao2018@tcp(127.0.0.1:3306)/gamelog?parseTime=true")

if err != nil
log.Fatal(err)

defer db.Close()

然后对db操作即可。


以上是关于go 常见外部包解析的主要内容,如果未能解决你的问题,请参考以下文章

27.Go 解析命令行参数

Go语言中关于包内函数供外部调用的问题

轻松上手!手把手带你掌握从Context到go设计理念

轻松上手!手把手带你掌握从Context到go设计理念

Go外部依赖包从vendor$GOPATH和$GOPATH/pkg/mod下的查找顺序

HTML中的javascript具体是啥时候调用? 是等整个页面内容都加载完毕时调用吗