gpt4 book ai didi

go - go 中的函数和参数解码?

转载 作者:IT王子 更新时间:2023-10-29 02:10:49 24 4
gpt4 key购买 nike

给定一个包含具有不同参数的函数的接口(interface)和该接口(interface)的具体实现,我如何获取字节流并根据该字节流从接口(interface)调用方法。基本上是一个 RPC 调用。

例如

type funcs interface {
func Hello(name string) (string, error)
func Add(numbers...int) (result, error)
}

假设我有以下输入数据

Hello John
Add 1 2 3 4

我认为这必须通过反射来完成,但我发现这个包的使用有点神秘。不是很好的例子。看RPC包也是有点玄乎。我不明白他们在做什么,似乎存在限制或假设,也许是为了使代码更简单和/或更快地实现。

有人可以阐明我如何使用字符串“Hello”并从 funcs 表中找到函数句柄“Hello”。并且知道它需要一个字符串参数,然后使用提供的参数“John”调用该函数。

最佳答案

您可以使用 reflect 执行此操作包(有关性能和代码可读性的一般警告适用)。只需创建一个类型并实现该类型的功能,然后调用 reflect.MethodByName()Value 上从该类型的实例创建:

package main

import (
"fmt"
"reflect"
)

type functions struct {}

func (f functions) Hello(name string) (string, error) {
fmt.Println("Hello,", name)
return name, nil
}

func main() {
var f functions
m := reflect.ValueOf(f).MethodByName("Hello")
if m.IsValid() {
// Either call f.Hello() here, or use the returned Value like so:
v := make([]reflect.Value, 1) // function Values only take Value slices as arguments
v[0] = reflect.ValueOf("Asha")
r := m.Call(v)
fmt.Println("Returned", r)
}
}

这打印:

Hello, Asha
Returned [Asha <error Value>]

(参见 https://play.golang.org/p/0q1i3WBuAL)

但是,如果您知道希望能够调用的函数名称​​先验,或者如果您希望用户能够使用确切函数名称以外的名称,只需使用switchif/else声明:

package main

import (
"fmt"
"strings"
)

func Hello(name string) {
fmt.Println("Hello,", name)
}

func main() {
userInput := make([]string, 2)
userInput[0] = "HeLlO"
userInput[1] = "재은"

switch(strings.ToLower(userInput[0])) { // allow any case
case "hello":
Hello(userInput[1])
default:
panic("user input not recognized")
}
}

这打印:

Hello, 재은

(参见 https://play.golang.org/p/oBxsI42q4a)

关于go - go 中的函数和参数解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com