小编Bur*_*hi5的帖子

如何在最新的Go Week中比较指针相等的两个函数?

在Go中,有没有办法比较两个非零函数指针来测试相等性?我的平等标准是指针平等.如果没有,是否有任何特殊原因不允许指针相等?

截至目前,如果我试图以直截了当的方式做到这一点:

package main

import "fmt"

func SomeFun() {
}

func main() {
    fmt.Println(SomeFun == SomeFun)
}
Run Code Online (Sandbox Code Playgroud)

我明白了

./func-pointers.go:12: invalid operation: SomeFun == SomeFun (func can only be compared to nil)
Run Code Online (Sandbox Code Playgroud)

我的理解是这种行为最近被引入.


我用反射包找到了答案; 但Atom在下面建议这实际上会产生不确定的行为.有关更多信息和可能的替代解决方案,请参阅Atom的帖子.

package main

import "fmt"
import "reflect"

func SomeFun() { }

func AnotherFun() { }

func main() {
    sf1 := reflect.ValueOf(SomeFun)
    sf2 := reflect.ValueOf(SomeFun)
    fmt.Println(sf1.Pointer() == sf2.Pointer())

    af1 := reflect.ValueOf(AnotherFun)
    fmt.Println(sf1.Pointer() == af1.Pointer())
}
Run Code Online (Sandbox Code Playgroud)

输出:

true
false
Run Code Online (Sandbox Code Playgroud)

function-pointers go go-reflect

26
推荐指数
2
解决办法
1万
查看次数

libsigsegv并响应堆栈溢出

我们正在尝试测试学生代码,并且为了自动化该过程,我们想要检测学生的代码是否溢出堆栈.

我使用libsigsegv库及其相应的stackoverflow_install_handler获得了一些成功.它的工作非常出色,直到学生的代码将堆栈吹两次.

例如,这里是一些示例输出:

[# ~]$ ledit ./interpreter
-> (use solution)
-> (fun 1 2)

*** Stack overflow detected ***
-> (fun 1 2)
Signal -10
[# ~]
Run Code Online (Sandbox Code Playgroud)

初始" *检测到堆栈溢出* "是理想的输出.在第二次吹掉堆栈之后,我得到的只是一个无用的"Signal -10",程序停止执行.我想再次看到堆栈溢出检测到的消息,让代码继续执行.

在我的堆栈溢出处理程序中,我只是将溢出检测消息打印到stderr并且长时间跳回到解释器中的"等待输入状态".

谢谢你的帮助!

编辑

根据下面的caf的建议,我们添加了对sigsegv_leave_handler()的调用,如下所示:

static void continuation(void *arg1, void *arg2, void *arg3) {                  
  (void)(arg1);                                                                 
  (void)(arg2);                                                                 
  (void)(arg3);                                                                 
  siglongjmp(errorjmp, 1);                                                      
}                                                                               

static void handler(int emergency, stackoverflow_context_t context) {           
 (void)emergency;                                                               
 (void)context;                                                                 
 fprintf(stderr, "\n*** Stack overflow detected ***\n");                        
 fflush(stderr);                                                                
 sigsegv_leave_handler(continuation, NULL, NULL, NULL);                         
}  
Run Code Online (Sandbox Code Playgroud)

但是,输出仍然相同.

c stack-overflow signals segmentation-fault

5
推荐指数
1
解决办法
1313
查看次数

当编写一个单独的包用作命令时,这是惯用的:将所有标识符命名为private或将所有标识符命名为public?

在Go中,公共名称以大写字母开头,私有名称以小写字母开头.

我正在编写一个不是库的程序,而且是一个程序包.是否有任何Go成语规定我的标识符是全部公开还是全部私有?我不打算将此软件包用作库或应该从其他Go程序导入的内容.

我想不出有什么理由想要混合物.它"感觉"像是私有化是正确的选择.


我认为我没有得到任何具体的答案,但是Nate最接近于告诉我要考虑"出口与非出口"而不是"公共与私人".

这让我相信不出口任何东西是最好的方法.在最糟糕的情况下,如果我最终从我的应用程序中导入另一个包中的代码,我将不得不重新考虑应该导出的内容和不应该导出的内容.这对IMO来说是件好事.

idioms private public idiomatic go

5
推荐指数
1
解决办法
131
查看次数