在golang中包含整数和nil值的数组?

时间:2018-09-21 18:56:59

标签: arrays go null integer

我是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值混合而成的数组?

2 个答案:

答案 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的指针。

https://play.golang.org/