Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 初始化自定义类型不需要';不能使用var,但可以使用:=_Variables_Go_Types - Fatal编程技术网

Variables 初始化自定义类型不需要';不能使用var,但可以使用:=

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,

我试图初始化一个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,错误){
如果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!!