那種動態呼叫技術效率最高?
//根據json
{"name":"年齡","opera":"==","value":25},
{"name":"性別","opera":"==","value":"男性"}
//生成程式碼
func GetResult(data map[string]interface{})string{
if data["年齡"]==25&&data["性別"]=="男性" {
return "小明"
}
}
// 前端傳遞過來的json
data:=map[string]interface{}{
"年齡":25,
"性別":"男性",
}
//在api裡動態呼叫生成的程式碼
func GetOne(data map[string]interface{})(string,error){
return GetResult(data),nil
}
1.使用第三方 otto 包可以嵌入 js 程式碼,不支援動態載入
//生成
package test
import (
"github.com/robertkrimen/otto"
)
type client struct {
VM *otto.Otto
}
func NewOtto() *client {
return &client{VM: otto.New()}
}
func (c *client) Run() string {
c.VM.Run(`
if (年齡==25&&性別=="男性"){
result="小明"
}
`)
v, err := c.VM.Get("result")
if err != nil {
panic(err)
}
value, err := v.ToString()
if err != nil {
panic(err)
}
return value
}
//呼叫
import (
"test"
)
func GetOne(data map[string]interface{})(string,error){
js := test.NewOtto()
for k, v := range data {
js.VM.Set(k, v)
}
return js.Run(), nil
}
2.使用偽包 C 可以嵌入 c 程式碼
// 生成
// foo.h
char* getResult(int,char*);
// foo.c
#include "foo.h"
char* getResult(int age,char* sex) {
if (age==25&&sex=="男性"){
return "小明";
}
}
// 編譯
$> gcc -c foo.c
$> ar rv libfoo.a foo.o
//呼叫
package main
// #cgo LDFLAGS: -L ./ -lfoo
// #include <stdio.h>
// #include <stdlib.h>
// #include "foo.h"
import "C"
func main() {
sex:=C.CString("男性")
result:=C.GoString(C.getResult(25,sex))//小明
}
3.格式化後編譯成包,不支援動態載入
// 生成
package test
type business struct{
data map[string]interface{}
}
func NewData(value map[string]interface{})*business{
return &business{data:value}
}
func (b *business) GetResult()string{
if b.data["年齡"]==25&&b.data["性別"]=="男性"{
return "小明"
}
}
// 編譯
import "os/exec"
exec.Command("gofmt")
exec.Command("go", "build",filePath)
// 呼叫
import (
"test"
"reflect"
"errors"
)
func GetOne(data map[string]interface{})(string,error){
obj:=reflect.ValueOf(test.NewData(data))
fun:=obj.MethodByName("GetResult")
if !fun.IsValid(){
return "",errors.New("GetResult不存在")
}
return fun.Call(nil)[0].String(),nil
}
還有沒有其他動態呼叫方法?
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 那種寫法執行效率高
- 動態網頁採集技術型別包括哪幾種網頁型別
- "陷阱"技術探秘 ──動態漢化Windows技術的分析 (轉)Windows
- 陷阱"技術探秘 ──動態漢化Windows技術的分析 (轉)Windows
- 影片美顏SDK動態處理技術與靜態處理技術
- Java動態追蹤技術探究Java
- 淺談動態追蹤技術
- 三種主流動態網頁製作技術比較之我見網頁
- java動態呼叫webserviceJavaWeb
- VC動態呼叫DLL
- DL動態載入框架技術文件框架
- 動態漢化Windows技術的分析 (轉)Windows
- Laravel 如何實現既能靜態呼叫,又能動態呼叫Laravel
- 呼叫中心技術概述 (轉)
- 面試驅動技術之 - isa && 元類 && 函式呼叫面試函式
- 面試驅動技術之 – isa && 元類 && 函式呼叫面試函式
- 寫技術部落格那點事
- 物件呼叫動態變數物件變數
- C#動態呼叫webserviceC#Web
- oracle呼叫C動態庫Oracle
- javascript動態隱藏顯示技術(轉)JavaScript
- PHP中動態HTML的輸出技術PHPHTML
- CTI技術和呼叫中心 (轉)
- 動態庫的建立和呼叫
- java動態呼叫c++庫JavaC++
- C#動態呼叫WCF介面C#
- linuxjna呼叫so動態庫Linux
- EXECUTE IMMEDIATE 呼叫動態過程
- 看完Java的動態代理技術——Pythoner笑了JavaPython
- Google最新開發技術動態 (中字視訊)Go
- 動態追蹤技術(中) - Dtrace、SystemTap、火焰圖
- 詳解.NET中的動態編譯技術編譯
- MFC抽象類之動態實現技術 (轉)抽象
- 技術團隊的情緒與效率
- 帶你學 Java 技術之動態代理機制Java
- 【轉】動態位元組碼技術跟蹤Java程式Java
- Struts2 動態方法呼叫(十三)
- C語言動態呼叫庫(轉)C語言