我是golang的新手。但是我找不到答案。
在python中,我可以做到,
array = [1, 2, 3, None, 5]
但是写的时候还是要
var array = [5]int {1, 2, 3, nil, 5}
编译器给我以下错误:
cannot convert nil to type int
如何在golang中创建一个由整数和nil值混合而成的数组?
答案 0 :(得分:2)
首先讲一点理论。 Python是一种动态类型的语言。尽管每个值都有一个类型,但是可以为变量分配任何类型的值而不会出现问题。因此,python集合可以包含多种类型的值,并且不要抱怨。以下是有效的python元组(1, 'a', None, True)
。 Go是一种静态类型的语言。如果将变量定义为整数,则不能为其分配任何非整数值。因此,Go中的集合具有一种类型,并且只能包含单一类型的对象。
现在开始练习。有几种方法可以做您想要的。经典的C方法是选择一个您永远不会遇到的整数值,并将其用作空值。 0或-1之类的东西。但是,这不是很可靠。
更惯用的方法是定义自己的类型。
package main
import "fmt"
type NilInt struct {
value int
null bool
}
func (n *NilInt) Value() interface{} {
if n.null {
return nil
}
return n.value
}
func NewInt(x int) NilInt {
return NilInt{x, false}
}
func NewNil() NilInt {
return NilInt{0, true}
}
func main() {
var x = []NilInt{NewNil(), NewInt(10), NewNil(), NewInt(5)}
for _, i := range x {
fmt.Printf("%v ", i.Value())
}
}
答案 1 :(得分:1)
go中的每种类型都有一个“零值”,该值在创建时会分配给它,以确保始终进行初始化。对于int,“零值”为0,对于字符串“”。不过,有些事情可以将// return all Groups and their Applications
const groupsToApplications = await Group.findAll({
include: [
{
model: Application,
as: 'applications',
through: 'group_application',
},
],
});
// return all Applications and their Groups
const applicationsToGroups = await Application.findAll({
include: [
{
model: Group,
as: 'groups',
through: 'group_application',
},
],
});
作为其值:
尽管只有第一个与这里有关。如果您想要一个int为零的int,则必须将其声明为该int的指针。由于分片不能具有混合类型,因此您需要使该分片成为指向int:nil
的类型指针的分片。因此,您可以使用指向包含nil值的int的指针:
*int
println中的zero := 0
ints := []*int{&zero, nil}
for _, anInt := range ints {
if anInt != nil {
fmt.Println(*anInt)
} else {
fmt.Println(anInt)
}
}
取消引用了将其变成*anInt
的指针,而不是指向int
的指针。