那種動態呼叫技術效率最高?
//根據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
相關文章
- 動態網頁採集技術型別包括哪幾種網頁型別
- 影片美顏SDK動態處理技術與靜態處理技術
- 什麼時間運動減肥效率最高?
- Java動態追蹤技術探究Java
- 淺談動態追蹤技術
- Laravel 如何實現既能靜態呼叫,又能動態呼叫Laravel
- 物件呼叫動態變數物件變數
- 寫技術部落格那點事
- 看完Java的動態代理技術——Pythoner笑了JavaPython
- java呼叫c++動態庫之jni呼叫JavaC++
- 面試驅動技術之 - isa && 元類 && 函式呼叫面試函式
- 面試驅動技術之 – isa && 元類 && 函式呼叫面試函式
- java動態呼叫c++庫JavaC++
- 動態庫的建立和呼叫
- Python中動態類和動態方法的建立與呼叫Python
- python ChainMap的呼叫效率PythonAI
- 3種關鍵技術,助力化驗單自動識別,醫療行業資料處理效率提升50%行業
- 呼叫鏈系列三:解讀UAVStack中的呼叫鏈技術
- 呼叫鏈系列二:解讀UAVStack中的呼叫鏈技術
- 呼叫鏈系列一:解讀UAVStack中的呼叫鏈技術
- 帶你學 Java 技術之動態代理機制Java
- Java使用FreeMarker模版技術動態生成word實踐Java
- 各種技術論壇
- 4個Excel核心技術,讓你效率翻倍!Excel
- 四種區塊鏈底層技術形態的對比解讀區塊鏈
- 助力提升移動研發效率的小程式容器技術,你瞭解嗎?
- Java中的超程式設計與動態代理技術Java程式設計
- 阿里雲容器服務 ACK 產品技術動態(202208)阿里
- 美顏sdk動態貼紙開發技術詳解
- 阿里雲容器服務 ACK 產品技術動態(202209)阿里
- 阿里雲容器服務 ACK 產品技術動態(202210)阿里
- 阿里雲容器服務 ACK 產品技術動態(202207)阿里
- 阿里雲容器服務 ACK 產品技術動態(202302)阿里
- 阿里雲 Serverless 產品技術動態(2022 年 3 月)阿里Server
- lvs+keepAlived→效率最高的負載均衡負載
- VS中呼叫DLL動態庫的方法
- 移動端動態方案–VideoOS技術選擇及具體實施IDE
- 移動端動態方案--VideoOS技術選擇及具體實施IDE
- ReactiveProgramming一種技術,各自表述React