Golang Go语言中能获取方法的入参的值吗?

Golang Go语言中能获取方法的入参的值吗?

查到如下信息
1.能查到方法的入参的类型
2.查不到方法的入参的名字,因为匿名参数的存在
3.stackoverflow 上两年前有人提过相同的问题,目前还没解决
请老哥们指教。
如果做不到,我想问:如何判断 go 没有提供这种内置函数,
比如哪里一搜,没有就没有,而不是全篇的看、找
我现在就两个渠道,1 是搜索引擎、2 是源码的 runtime 包,里面没有找到,我就没有思路了。

21 回复

没读懂题……

更多关于Golang Go语言中能获取方法的入参的值吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 https://stackoverflow.com/questions/44085092/can-we-get-callers-function-argument-parameter-values-using-go 这是 stockoverflow 上的描述,老哥看一下,这就是我想问的

楼主最好能附带一些代码,不然很难看懂你想要说什么

您好,这边建议您先学好中文再学其他语言呢 :doge:

试一试反射

package main <br>
<br>
func A(a int){} <br>
<br>
func main(){ <br>
A(1) <br>
//我想在这里(main 函数里)获得 A 的入参,即 1 <br>
} <br>

package main

func A(a int){}

func main(){
A(1)
//我想在这里(main 函数里)获得 A 的入参,即 1
}

不传参的情况下想获取 caller 的参数只能通过栈回溯解决吧

#5 试过反射,反射能获得入参的类型,但是不能获得入参的值
我觉得一个在 runtime 包里,因为方法的入参是运行时才确定的

#8 我试过栈回溯,现在能拿到回溯的 func 的 uintptr。
这个 uintptr 能转成 unsafe.Pointer (还没试)从而获得 func,但是拿不到入参

函数的地址,入参,都是放栈里面的。通过访问栈内存,找到入参地址,应该可以找到值吧。
随便找了一篇关于 go 栈的文章: https://studygolang.com/articles/12443

我看了一下 SO 上面的描述,感觉是在写装饰器。
用例子里面的参数指针在装饰器部分做参数传递的工作不就可以了?有什么问题吗?

反射能获得是因为方法参数的类型是编译后就确定的吧,而方法参数的值是运行时才能得到的

#13 是的

反射是可以获得值的.

#15 老哥愿意详细说说吗?
#12 感谢,有点思路了,我试试

lz 描述代码有问题,应该是

A§ {
B() { 在这里获取 p 的值}
}

reflect.TypeOf(a)
reflect.ValueOf(a)

… 这个参数值都是同一个代码块里面了。。。不明白这种是什么需求。

#19 我想看不同代码块里的,你可以看一下我 7 楼的描述

在Go语言中,直接获取方法的入参值在运行时并不是通过一种显式或内置的机制来实现的,因为Go语言设计哲学倾向于简洁和明确性,并不提供像某些动态语言那样的反射来直接访问函数参数的能力(至少在标准库中是这样的)。然而,你可以通过一些编程技巧和设计模式来间接达到类似的效果。

一种常见的方法是使用变参函数(variadic functions)配合切片来接收参数,然后在函数内部处理这些参数。这样你可以在函数体内访问和操作这些参数的值。

另外,如果你需要在调试或日志记录中查看函数参数,你可以手动将参数值打印出来,或者使用自定义的日志记录函数来封装这一过程。

对于更复杂的需求,比如需要在运行时动态地检查函数签名和参数类型,你可以借助Go的反射包(reflect)。虽然反射可以让你在运行时检查类型和值,但它的使用相对复杂,且性能开销较大,通常不推荐在性能敏感的代码路径中使用。

总之,虽然Go语言没有直接提供获取方法入参值的内置机制,但通过变参函数、手动打印日志以及使用反射包,你可以在不同场景下实现对函数参数值的访问和处理。选择哪种方法取决于你的具体需求和性能考虑。

回到顶部