我是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() ,但也不例外。 将错误视为值,并考虑适当地处理它们;-)
由于数字不能为
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 } |
然后在某个地方您可以将
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中没有
Go具有允许多个返回值的好功能。 并且他们的错误处理基于此。
因此,处理异常可能性的规范方法是同时返回值和错误。 操作之后,将检查错误并采取措施,忽略该值。 在您的情况下,可以将值保留为
- 但是,如果堆栈可以包含0怎么办?在我看来,从客户端来看,它看起来很丑。例如,我们知道0可以指示错误,并且我们有第二个布尔值,当我们遇到异常时为true:if resp0 == 0 && resp1 == true {//异常处理}您的意思是这样写?
-
您应该始终检查错误情况。因此,如果没有收到错误,但弹出的值是
0 ,则知道它是一个不错的值。测试应该只是if resp1 != nil { exception handling } 。您不看resp0 ,直到您知道resp1 == nil 并且没有发生错误。因此,您可以相信resp0 是堆栈中的有效值。那是教条主义。您不应该忽略该错误,应该尽快处理它,而不是稍后在某个地方关闭catch 。 - 通常,对于这种简单情况,使用布尔值而不是错误,但这对于一般情况是正确的。在这两种情况下,您都应该在执行其他任何操作之前始终检查错误/布尔值。如果被问者正确检查了错误,则此处会发布很多很多问题,答案很明显。