我是一名java开发人员,我正在学习Go。 我正在为LIFO堆栈编写简单的'pop'操作。问题是当堆栈中没有值时返回值。在java中,我能够在正例中返回一个包装器(Integer),在没有值时返回null。从我的角度来看,这是很自然的。
我怎样才能在Go中做类似的事情?原语是否有任何结构包装器?我是否需要返回两个值(第二个将指示错误代码)?或者我是否需要抛出异常?
以下是它现在的样子:
func (s *stack) Pop() (int, bool) {
if s.size == 0 {
return 0, true
}
s.size--
val := s.stack[s.size]
return val, false
}
风格好吗?
答案 0 :(得分:9)
由于数字不能为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
称为
s := &stack{}
if v, ok := s.Pop(); ok {
//the value exists
}
答案 1 :(得分:2)
Go中没有try/catch
个构造,所以你不能依赖它。
Go有一个很好的功能,允许多个返回值。他们的error handling建立在此基础之上。
因此,处理异常可能性的规范方法是返回值和错误。在操作之后,检查错误并对其起作用,忽略该值。在您的情况下,您可以将值保留为int
,并在出现错误时使用默认值0
。由于客户希望忽略该情况下的值并对错误采取一些措施。