Variables 初始化自定义类型不需要';不能使用var,但可以使用:=
我试图初始化一个ErrNegativeSqrt,它是一个自定义的float64类型,但是如果我使用Variables 初始化自定义类型不需要';不能使用var,但可以使用:=,variables,go,types,Variables,Go,Types,我试图初始化一个ErrNegativeSqrt,它是一个自定义的float64类型,但是如果我使用var初始化它,它就不起作用了 查看func Sqrt(x float64)(float64,错误): 主程序包 进口( “fmt” ) 类型ErrNegativeSqrt float64 func(e*ErrNegativeSqrt)Error()字符串{ 返回fmt.Sprint(“无法Sqrt负数:%f”,float64(*e)) } func Sqrt(x float64)(float64,
var
初始化它,它就不起作用了
查看func Sqrt(x float64)(float64,错误)
:
主程序包
进口(
“fmt”
)
类型ErrNegativeSqrt float64
func(e*ErrNegativeSqrt)Error()字符串{
返回fmt.Sprint(“无法Sqrt负数:%f”,float64(*e))
}
func Sqrt(x float64)(float64,错误){
如果x<0{
var err err negativesqrt=x
//这是有效的:err:=ErrNegativeSqrt(x)
返回x,&错误
}
z:=x/2
i:=1
对于prev_z:=0.0;z!=prev_z&&Abs(z-prev_z)>0.000000000000001;i++{
上一个z=z
z-=(z*z-x)/(2*z)
}
返回z,零
}
func Abs(x float64)float64{
如果x<0{
x=-x
}
返回x
}
func main(){
格式打印(Sqrt(2))
格式打印(Sqrt(-2))
}
错误为:/prog.go:15:7:无法在分配中使用x(类型float64)作为类型ErrNegativeSqrt
为什么会这样?这与:=
的作业不一样吗
在这方面:
您显式地给err
一种类型的ErrNegativeSqrt
,并尝试将x
分配给它,但x
属于float64
类型,不能分配给ErrNegativeSqrt
类型的值。规则不适用,float64
和ErrNegativeSqrt
是两种不同的、不同的类型(尽管后者将前者作为其属性,因此它们是彼此的)
使用此选项时:
您显式地x
到ErrNegativeSqrt
,因此x
的类型将被推断为ErrNegativeSqrt
当使用var
关键字时,您也可以这样做:
var err ErrNegativeSqrt = ErrNegativeSqrt(x)
或者简单地说:
var err = ErrNegativeSqrt(x)
这正是the的缩写形式
笔记
如前所述,var err ErrNegativeSqrt=x
无效,因为规则不适用:
如果下列条件之一适用,则值x
可分配给类型T
(“x
可分配给T
”):
的类型与x
相同T
的类型x
和V
相同,并且T
或V
中至少有一个不是类型T
是一种接口类型,并且T
x
T
是双向通道值,x
是通道类型,T
的类型x
和V
具有相同的元素类型,并且T
或V
中至少有一个不是定义的类型T
是预先声明的标识符x
,nil
是指针、函数、切片、映射、通道或接口类型T
是由类型为x
的值进行的非类型化T
x
的类型V
和T
具有相同的基础类型,并且V
或T
中至少有一个不是定义的类型
它之所以“几乎”是因为ErrNegativeSqrt
和float64
都是命名()类型
当您这样做时:
var err ErrNegativeSqrt = 1.0
这是因为您正在分配一个非类型化的1.0
,它可以在需要时采用所需的类型(如上面的分配)。由于您正在分配类型为ErrNegativeSqrt
的err
,非类型常量1.0
可以采用类型ErrNegativeSqrt
(因为ErrNegativeSqrt
的基础类型是float64
,而1.0
是非类型浮点常量)。这种情况正是最后一条可转让规则:
x
是由类型为T
的值进行的非类型化
如果你愿意:
var err ErrNegativeSqrt = float64(1.0) // FAIL!!
这将再次失败,就像你在问题中的例子一样,因为这里我们使用的是一个不能任意改变类型的类型常量,没有允许这种情况的可赋值规则
阅读博客文章,了解常量在Go中如何工作的更多详细信息。在此:
您显式地给err
一种类型的ErrNegativeSqrt
,并尝试将x
分配给它,但x
属于float64
类型,不能分配给ErrNegativeSqrt
类型的值。规则不适用,float64
和ErrNegativeSqrt
是两种不同的、不同的类型(尽管后者将前者作为其属性,因此它们是彼此的)
使用此选项时:
您显式地x
到ErrNegativeSqrt
,因此x
的类型将被推断为ErrNegativeSqrt
当使用var
关键字时,您也可以这样做:
var err ErrNegativeSqrt = ErrNegativeSqrt(x)
或者简单地说:
var err = ErrNegativeSqrt(x)
这正是the的缩写形式
笔记
如前所述,var err ErrNegativeSqrt=x
无效,因为规则不适用:
如果下列条件之一适用,则值x
可分配给类型T
(“x
可分配给T
”):
的类型与x
相同T
的类型x
和V
相同,并且T
或V
中至少有一个不是类型T
是一种接口类型,并且T
x
T
是双向通道值,x
是通道类型,T
的类型x
和V
具有相同的元素类型,并且T
或V
中至少有一个不是定义的类型T
是预先声明的标识符x
,nil
是指针、函数、切片、映射、通道T
var err ErrNegativeSqrt = float64(1.0) // FAIL!!