go项目技术(部分)

mongo-go-diver

连接数据库,并初始化集合连接

database/mongo.go

var CollectionName *mongo.Collection


func InitDB(){

   ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)

   client, err := mongo.Connect(ctx, options.Client().ApplyURI(url))

   if err != nil {
      panic(err)
   }
   db := client.Database("web")

   CollectionName = db.Collection(collectionName)
}

main.go

main函数中初始化

func init() {
   database.InitDB()
}

service中的crud

create

插入一个

res,err:=database.CollectionName.InsertOne(context.Background(),model.struct,options...)
if err!=nil {
    ...
   return 
}

插入多个

res,err:=database.CollectionName.InsertMany(context.Background(),[]model.struct,options...)
if err!=nil {
    ...
   return 
}

find

多项结果

var res []model.struct   //数据库获取的结构体数组

data, err := database.CollectionName.Find(context.Background(), bson.M{"sex":sex},options...)
if err != nil {
    ...
   return 
}
if err = data.All(context.Background(), &res); err != nil {
    ...
   return 
}

仅一项结果

err := database.CollectionName.FindOne(context.Background(), bson.M{"_id": id}).Decode(&model.struct)
if err != nil {
    ...
   return 
}

update

which :=  bson.M{key:value}  // 修改哪个
how := bson.M{"$set":bson.M{key:value}}  //怎样修改

res, err := database.CollectionName.UpdateOne(context.Background(),which, how,options...)
if err != nil {
    ...
   return 
}

delete

res, err := database.CollectionName.DeleteOne(context.Background(), bson.M{"_id": _id})
if err != nil { 
    ...
   return 
}

go-redis

初始化redis连接池,建立连接

gredis/gredis.go

var RedisConn *redis.Pool
func Setup()error{
   RedisConn = &redis.Pool{
      Dial: func() (redis.Conn, error) {
          c,err := redis.Dial("tcp",url)
         if err!=nil{
            fmt.Println("连接失败")
            return nil, err
         }
         return c,err
      },
   }
   return nil
}

main.go

func init() {
    err := gredis.Setup()
   if err != nil {
        panic(err)
    }
}

redis相关操作(未完善)

// Set a key/value
func Set(key string, data interface{}, time int) error {
   conn := RedisConn.Get()
   defer conn.Close()
   value, err := json.Marshal(data)
   if err != nil {
      return err
   }

   _, err = conn.Do("SET", key, value)
   if err != nil {
      return err
   }

   _, err = conn.Do("EXPIRE", key, time)
   if err != nil {
      return err
   }

   return nil
}

// Exists check a key
func Exists(key string) bool {
   conn := RedisConn.Get()
   defer conn.Close()

   exists, err := redis.Bool(conn.Do("EXISTS", key))
   if err != nil {
      return false
   }

   return exists
}

// Get get a key
func Get(key string) ([]byte, error) {
   conn := RedisConn.Get()
   defer conn.Close()

   reply, err := redis.Bytes(conn.Do("GET", key))
   if err != nil {
      return nil, err
   }

   return reply, nil
}

// Delete delete a kye
func Delete(key string) (bool, error) {
   conn := RedisConn.Get()
   defer conn.Close()

   return redis.Bool(conn.Do("DEL", key))
}

// LikeDeletes batch delete
func LikeDeletes(key string) error {
   conn := RedisConn.Get()
   defer conn.Close()

   keys, err := redis.Strings(conn.Do("KEYS", "*"+key+"*"))
   if err != nil {
      return err
   }

   for _, key := range keys {
      _, err = Delete(key)
      if err != nil {
         return err
      }
   }

   return nil
}

跨域

1、gin有个官方的跨域中间件

https://github.com/gin-contrib/cors

import "github.com/gin-contrib/cors"

router.Use(cors.Default())

2、自定义跨域中间件

middleware/cors/cors.go

package Cors

import (
   "net/http"

   "github.com/gin-gonic/gin"
)

type Options struct {
   Origin string
}

func CORS(options Options) gin.HandlerFunc {
   return func(c *gin.Context) {
      if options.Origin != "" {
         c.Writer.Header().Set("Access-Control-Allow-Origin", options.Origin)  ////"*"表示接受任意域名的请求,这个值也可以根据自己需要,设置成不同域名
      }
      c.Writer.Header().Set("Access-Control-Max-Age", "86400")
      c.Writer.Header().Set("Access-Control-Allow-Methods", "*")  
      c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization,ID,Authority,*")   // 允许自定义header
      c.Writer.Header().Set("Access-Control-Expose-Headers", "*")
      c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")

      if c.Request.Method == "OPTIONS" {
         c.AbortWithStatus(http.StatusNoContent)
      } else {
         c.Next()
      }
   }
}
全部评论

相关推荐

暴走萝莉莉:这是社招场吧,作为HR说个实话:这个维护关系的意思是要有政府资源,在曾经的工作中通过人脉资源拿下过大订单的意思。这个有相关管理经验,意思也是真的要有同岗位经验。应酬什么的对于业务成交来说就算不乐意也是常态,就是要求说话好听情商高,酒量好。
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务