我在Go中编写了一个Lisp变体,想要为Nil
和EmptyList
定义常量。这些将在整个代码库中引用,但我想防止它们被意外重新定义。
// Representation of the empty list
var EmptyList = (*List)(nil)
我在这里不能使用const
有两个原因:
const
定义不能为nil
const
定义不能成为指针我有哪些选项可以确保EmptyList
始终是nil指针?
答案 0 :(得分:1)
在Go中,使用一个功能。例如,
package main
import "fmt"
type List struct{}
func IsEmptyList(list *List) bool {
// Representation of the empty list
return list == (*List)(nil)
}
func main() {
fmt.Println(IsEmptyList((*List)(nil)))
}
输出:
true
该功能将被内联。
$ go tool compile -m emptylist.go
emptylist.go:7: can inline IsEmptyList
emptylist.go:13: inlining call to IsEmptyList
emptylist.go:7: IsEmptyList list does not escape
emptylist.go:13: IsEmptyList((*List)(nil)) escapes to heap
emptylist.go:13: main ... argument does not escape
$