golang按请求中的不同标识处理不同的业务逻辑

前端之家收集整理的这篇文章主要介绍了golang按请求中的不同标识处理不同的业务逻辑前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

目录结构:

I:\workspace_goland\hello>tree /F
卷 新加卷 的文件夹 PATH 列表
卷序列号为 F04C-09C0
I:.
├─bin
├─pkg
└─src
│ main.go
│ system.json

└─com
├─bo
│ adsl.go
│ lan.go

└─conf
system.go


main.go

package main

import (
   "com/bo"  "com/conf"  "fmt"  "reflect"  "strconv"  "strings" )

var regStruct map[string]interface{}
var sys conf.System

func init() {

   conf.LoadConfig("I:/workspace_goland/hello/src/system.json",&sys)

   regStruct = make(map[string]interface{})
   regStruct["Adsl"] = bo.Adsl{}
   regStruct["Lan"] = bo.Lan{}

}

//golang按请求中的不同标识处理不同的业务逻辑 func main() {

   request := "3|||1|||P01=1|||M02=3"  doRequest(request,sys)

   request = "4|||2|||P01=1|||M02=3"  doRequest(request,sys)
}

func doRequest(request string,sys conf.System) {
   //解析请求,获取业务对象,操作对象和其他数据  fmt.Println("request: ",request)
   fields := strings.Split(request,"|||")
   objtype,_ := strconv.Atoi(fields[0])
   opttype,_ := strconv.Atoi(fields[1])
   ruleClassName := getRuleClassName(sys,objtype)
   methodName := getOptMethodName(sys,opttype)

   execute(ruleClassName,methodName)
}

//通过反射调用对象的操作方法 func execute(ruleClassName string,methodName string) {
   t := reflect.TypeOf(regStruct[ruleClassName])
   response := reflect.New(t).MethodByName(methodName).Call(nil)
   fmt.Println("response: ",response)
   fmt.Println()
}

func getOptMethodName(sys conf.System,opttype int) string {
   var ret = ""  optList := sys.OptList
   for _,obj := range optList {
      if opttype == obj.OptType {
         ret = obj.MethodName
         fmt.Println("methodName: ",ret)
         break  }
   }
   return ret
}

func getRuleClassName(sys conf.System,objtype int) string {
   var ret = ""  objList := sys.ObjList
   for _,obj := range objList {
      if objtype == obj.ObjType {
         ret = obj.RuleClassName
         fmt.Println("RuleClassName: ",ret)
         break  }
   }
   return ret
}
 
 

adsl.go

package bo

type Adsl struct {
}

func (obj Adsl) Add() string {
   ret := "invoke adsl add,then return data"  return ret
}

func (obj Adsl) Del() string {
   ret := "invoke adsl delete,then return data"  return ret
}
 
 

lan.go

package bo

type Lan struct {
}

func (obj Lan) Add() string {
   ret := "invoke lan add,then return data"  return ret
}

func (obj Lan) Del() string {
   ret := "invoke lan delete,then return data"  return ret
}


system.go

package conf

import (
   "encoding/json"  "fmt"  "io/IoUtil" )

type System struct {
   ObjList []obj `json:"objList"`  OptList []opt `json:"optList"` }

type obj struct {
   ObjType       int    `json:"objType"` //变量首字母必须大写,不然解析不出来数据  RuleClassName string `json:"ruleClassName"`  ServiceType   int    `json:"serviceType"` }

type opt struct {
   OptType    int    `json:"optType"`  MethodName string `json:"methodName"` }

func LoadConfig(path string,v interface{}) {
   bytes,err := IoUtil.ReadFile(path)
   if err != nil {
      fmt.Printf("Failed to open config file '%s': %s\n",path,err)
      return  }
   err = json.Unmarshal(bytes,v)
   if err != nil {
      fmt.Println("Unmarshal: ",err.Error())
      return  }
}
 
 

system.json

{
  "objList": [
    {
      "objType": 3,"ruleClassName": "Adsl","serviceType": 1
    },{
      "objType": 4,"ruleClassName": "Lan","serviceType": 2
    }
  ],"optList": [
    {
      "optType": 1,"methodName": "Add"  },{
      "optType": 2,"methodName": "Del" }
  ]
}
原文链接:https://www.f2er.com/go/187321.html

猜你在找的Go相关文章