Arrays 在golang中包含整数和零值的数组?
我是刚来戈朗的。但我找不到答案 在python中,我可以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。不过,有些东西的价值可能为零: 指针 接口 地
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类型。