如何在golang中返回int或nil?

如何在golang中返回int或nil?,go,Go,我是一名java开发人员,正在学习Go。 我正在为后进先出堆栈编写简单的“pop”操作。问题在于堆栈中没有值时的返回值。在java中,我能够在正数情况下返回包装器(整数),在没有值时返回null。在我看来这是很自然的 我如何在围棋中做类似的事情?是否有用于原语的结构包装器?我是否需要返回两个值(第二个值表示错误代码)?还是我需要抛出一个异常 以下是目前的情况: func (s *stack) Pop() (int, bool) { if s.size == 0 { re

我是一名java开发人员,正在学习Go。 我正在为后进先出堆栈编写简单的“pop”操作。问题在于堆栈中没有值时的返回值。在java中,我能够在正数情况下返回包装器(整数),在没有值时返回null。在我看来这是很自然的

我如何在围棋中做类似的事情?是否有用于原语的结构包装器?我是否需要返回两个值(第二个值表示错误代码)?还是我需要抛出一个异常

以下是目前的情况:

func (s *stack) Pop() (int, bool)  {
    if s.size == 0 {
        return 0, true
    }
    s.size--
    val := s.stack[s.size]
    return val, false
}

它的风格好吗?

围棋中没有try/catch结构,所以你不能依赖它

Go有一个很好的特性,允许多个返回值。他们的目标就是建立在这个基础上的


因此,处理异常可能性的规范方法是同时返回一个值和一个错误。操作完成后,将检查错误并对其执行操作,忽略该值。在您的情况下,可以将该值保留为
int
,并在出现错误时使用默认值
0
。由于客户端希望在这种情况下忽略该值,并对错误采取措施。

由于数字不能为
nil
,因此不能为整数返回
nil
,除非将返回值定义为指针。Go中惯用的解决方案是定义方法以返回多个值,例如

func (s *stack) Pop() (int, bool) {
    //does not exists
    if ... {
        return 0, false
    }

    //...

    //v is the integer value
    return v, true
}
然后在某个地方你可以调用
Pop
as

s := &stack{}
if v, ok := s.Pop(); ok {
    //the value exists
}

查看。

您可以返回一个
*int
。不过,不确定这是否好。请注意,这种语言叫做“Go”。两个字母,第一个大写。“golang”是域名的一部分,是一个流行搜索引擎可以理解的特殊关键字,该搜索引擎由Go开发的公司所有。另一点是Go也不例外(幸运的是)。它有
panic()
recover()
但它们是,并考虑;但若堆栈可以包含0呢?在我看来,从客户的角度来看,它看起来会很难看。例如,我们知道0可以表示一个错误,当我们有异常时,我们有第二个布尔值为true:如果resp0==0&&resp1==true{//exception handling}您想这样写吗?您应该始终检查错误条件。因此,如果您没有得到错误,但poped的值为
0
,则您知道这是一个好值。如果resp1!=无{//异常处理}。您不会查看
resp0
,直到您知道
resp1==nil
并且没有发生错误。因此,您可以信任
resp0
是堆栈中的有效值。那样做是武断的。您不应该忽略错误,您应该尽快处理它,而不是在
catch
中稍后关闭。通常对于这种简单的情况,使用布尔值代替错误,但这对于一般情况是正确的。在这两种情况下,您应该在执行任何其他操作之前始终检查错误/布尔值。这里有很多问题,如果被问者正确地检查了错误,答案会很明显。谢谢。这是我现在拥有的。如果某些内容不是“go”样式,请更正:func(s*stack)Pop()(int,bool){if s.size==0{return 0,true}s.size--val:=s.stack[s.size]return val,false}@the_kaba第一个返回应该是:
return 0,false
,第二个返回应该是
return val,true