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

Arrays 在golang中包含整数和零值的数组?,arrays,go,null,integer,Arrays,Go,Null,Integer,我是刚来戈朗的。但我找不到答案 在python中,我可以 array = [1, 2, 3, None, 5] 但在我写作的时候 var array = [5]int {1, 2, 3, nil, 5} 编译器给了我以下错误: cannot convert nil to type int 如何在golang中创建一个由整数值和零数值混合而成的数组?go中的每种类型都有一个零值,在创建时会将其赋值,以确保始终初始化。对于int,字符串的零值为0。不过,有些东西的价值可能为零: 指针 接口 地

我是刚来戈朗的。但我找不到答案

在python中,我可以

array = [1, 2, 3, None, 5]
但在我写作的时候

var array = [5]int {1, 2, 3, nil, 5}
编译器给了我以下错误:

cannot convert nil to type int

如何在golang中创建一个由整数值和零数值混合而成的数组?

go中的每种类型都有一个零值,在创建时会将其赋值,以确保始终初始化。对于int,字符串的零值为0。不过,有些东西的价值可能为零:

指针 接口 地图 片 渠道 功能类型 不过,这里只有第一个是真正相关的。如果希望int为nil,则必须将其声明为指向该int的指针。由于切片不能具有混合类型,则需要将切片设置为指向int:*int类型的切片。因此,可以将指向int的指针切片包含nil值:

zero := 0
ints := []*int{&zero, nil}
for _, anInt := range ints {
    if anInt != nil {
        fmt.Println(*anInt)
    } else {
        fmt.Println(anInt)
    }
}
println中的*anInt取消引用指针,将其转换为int,而不是指向int的指针


go中的每个类型都有一个零值,在创建该类型时会将其赋值,以确保它始终处于初始化状态。对于int,字符串的零值为0。不过,有些东西的价值可能为零:

指针 接口 地图 片 渠道 功能类型 不过,这里只有第一个是真正相关的。如果希望int为nil,则必须将其声明为指向该int的指针。由于切片不能具有混合类型,则需要将切片设置为指向int:*int类型的切片。因此,可以将指向int的指针切片包含nil值:

zero := 0
ints := []*int{&zero, nil}
for _, anInt := range ints {
    if anInt != nil {
        fmt.Println(*anInt)
    } else {
        fmt.Println(anInt)
    }
}
println中的*anInt取消引用指针,将其转换为int,而不是指向int的指针


首先是一点理论。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())
    }
}

首先是一点理论。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())
    }
}

Nil不是整数。nil int仅为0。我想创建一个数组作为函数的输入。0也将是有效的输入。当我想让函数忽略输入序列中的一些值时,我想要一些与Python中的None等效的值。必须使用其他类型,例如,a*int.Nil不是整数。nil int仅为0。我想创建一个数组作为函数的输入。0也将是有效的输入。当我想让函数忽略输入序列中的一些值时,我想要一些与Python中的None等效的值。您必须使用不同的类型,例如a*int。非常好的答案。谢谢你的解释!我喜欢为int创建一个新类型,但我认为将其创建为一个带有值函数的新int类型会更简单。如果切片是指向此类型的指针,则可以直接将nil放入切片中,而不需要额外布尔值的NilInt函数。然后还可以对==nil执行相等性测试,而不必调用value。请看这个工作示例:我尝试过这样做,但在Go1.11中它似乎对我不起作用。不确定我是否做错了什么,但它甚至不允许为自定义int类型指定nil。回答得很好。谢谢你的解释!我喜欢为int创建一个新类型,但我认为将其创建为一个带有值函数的新int类型会更简单。如果切片是指向此类型的指针,则可以直接将nil放入切片中,而不需要NilInt f
额外布尔值的函数。然后还可以对==nil执行相等性测试,而不必调用value。请看这个工作示例:我尝试过这样做,但在Go1.11中它似乎对我不起作用。不确定我是否做错了什么,但它甚至不允许将nil赋值给自定义int类型。