查到如下信息
1.能查到方法的入参的类型
2.查不到方法的入参的名字,因为匿名参数的存在
3.stackoverflow 上两年前有人提过相同的问题,目前还没解决
请老哥们指教。
如果做不到,我想问:如何判断 go 没有提供这种内置函数,
比如哪里一搜,没有就没有,而不是全篇的看、找
我现在就两个渠道,1 是搜索引擎、2 是源码的 runtime 包,里面没有找到,我就没有思路了。
1
index90 2019-06-19 14:36:01 +08:00
没读懂题……
|
2
aschoolboy OP @index90 #1 https://stackoverflow.com/questions/44085092/can-we-get-callers-function-argument-parameter-values-using-go 这是 stockoverflow 上的描述,老哥看一下,这就是我想问的
|
3
karenn 2019-06-19 14:42:22 +08:00
楼主最好能附带一些代码,不然很难看懂你想要说什么
|
4
ETiV 2019-06-19 14:43:00 +08:00 via iPhone 1
您好,这边建议您先学好中文再学其他语言呢 :doge:
|
5
yiqiok 2019-06-19 14:45:00 +08:00 via iPhone
试一试反射
|
6
aschoolboy OP package main <br>
<br> func A(a int){} <br> <br> func main(){ <br> A(1) <br> //我想在这里(main 函数里)获得 A 的入参,即 1 <br> } <br> |
7
aschoolboy OP package main
func A(a int){} func main(){ A(1) //我想在这里(main 函数里)获得 A 的入参,即 1 } |
8
nyanyh 2019-06-19 14:48:25 +08:00
不传参的情况下想获取 caller 的参数只能通过栈回溯解决吧
|
9
aschoolboy OP @yiqiok #5 试过反射,反射能获得入参的类型,但是不能获得入参的值
我觉得一个在 runtime 包里,因为方法的入参是运行时才确定的 |
10
aschoolboy OP @nyanyh #8 我试过栈回溯,现在能拿到回溯的 func 的 uintptr。
这个 uintptr 能转成 unsafe.Pointer (还没试)从而获得 func,但是拿不到入参 |
11
index90 2019-06-19 14:52:29 +08:00
函数的地址,入参,都是放栈里面的。通过访问栈内存,找到入参地址,应该可以找到值吧。
随便找了一篇关于 go 栈的文章: https://studygolang.com/articles/12443 |
12
neoblackcap 2019-06-19 14:52:47 +08:00
我看了一下 SO 上面的描述,感觉是在写装饰器。
用例子里面的参数指针在装饰器部分做参数传递的工作不就可以了?有什么问题吗? |
13
karenn 2019-06-19 14:57:12 +08:00
@aschoolboy 反射能获得是因为方法参数的类型是编译后就确定的吧,而方法参数的值是运行时才能得到的
|
14
aschoolboy OP @karenn #13 是的
|
15
itfun 2019-06-19 15:13:16 +08:00 via iPhone
反射是可以获得值的.
|
16
aschoolboy OP |
17
rrfeng 2019-06-19 15:50:57 +08:00
lz 描述代码有问题,应该是
A(p) { B() { 在这里获取 p 的值} } |
18
itfun 2019-06-19 18:12:15 +08:00
@aschoolboy reflect.TypeOf(a)
reflect.ValueOf(a) |
19
skiy 2019-06-20 09:19:35 +08:00
... 这个参数值都是同一个代码块里面了。。。不明白这种是什么需求。
|
20
aschoolboy OP @skiy #19 我想看不同代码块里的,你可以看一下我 7 楼的描述
|