我是Java开发人员,正在学习Go。
我正在为LIFO堆栈编写简单的" pop"操作。 问题是堆栈中没有值时的返回值。 在Java中,我可以在肯定的情况下返回wrapper(Integer),在没有值的情况下返回null。 从我的角度来看这很自然。

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

现在看起来是这样的:

1
2
3
4
5
6
7
8
func (s *stack) Pop() (int, bool)  {
    if s.size == 0 {
        return 0, true
    }
    s.size--
    val := s.stack[s.size]
    return val, false
}

风格好吗?

  • 您可以返回*int。 不过,不确定是否很好。
  • 请注意,该语言称为" Go"。 两个字母,第一个字母大写。" golang"是域名的一部分,并且是Go起源于一家公司的流行搜索引擎所理解的特殊关键字。
  • 还有一点是,Go没有例外(幸运的是)。 它具有panic()recover(),但也不例外。 将错误视为值,并考虑适当地处理它们;-)

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

1
2
3
4
5
6
7
8
9
10
11
func (s *stack) Pop() (int, bool) {
    //does not exists
    if ... {
        return 0, false
    }

    //...

    //v is the integer value
    return v, true
}

然后在某个地方您可以将Pop称为

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

看一下逗号,好的成语。

  • 谢谢。这是我现在拥有的。如果不是go风格,请更正:func(s * stack)Pop()(int,bool){如果s.size == 0 {return 0,true} s.size-- val:= s.stack [ s.size] return val,false}
  • @the_kaba第一个返回应该是:return 0, false,第二个返回应该是return val, true

Go中没有try/catch构造,因此您不能依赖它。

Go具有允许多个返回值的好功能。 并且他们的错误处理基于此。

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

  • 但是,如果堆栈可以包含0怎么办?在我看来,从客户端来看,它看起来很丑。例如,我们知道0可以指示错误,并且我们有第二个布尔值,当我们遇到异常时为true:if resp0 == 0 && resp1 == true {//异常处理}您的意思是这样写?
  • 您应该始终检查错误情况。因此,如果没有收到错误,但弹出的值是0,则知道它是一个不错的值。测试应该只是if resp1 != nil { exception handling }。您不看resp0,直到您知道resp1 == nil并且没有发生错误。因此,您可以相信resp0是堆栈中的有效值。那是教条主义。您不应该忽略该错误,应该尽快处理它,而不是稍后在某个地方关闭catch
  • 通常,对于这种简单情况,使用布尔值而不是错误,但这对于一般情况是正确的。在这两种情况下,您都应该在执行其他任何操作之前始终检查错误/布尔值。如果被问者正确检查了错误,则此处会发布很多很多问题,答案很明显。