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
带指针引用的Go测试函数_Go - Fatal编程技术网

带指针引用的Go测试函数

带指针引用的Go测试函数,go,Go,我正在一个围棋项目中进行单元测试,我是新手。所以开始我想测试一些简单的东西。我从这个函数开始: func (this *Service) InList(idPerson string, personsId []string) bool { for _, personsId := range personsId { if id == idPerson { return true } } return false }

我正在一个围棋项目中进行单元测试,我是新手。所以开始我想测试一些简单的东西。我从这个函数开始:

func (this *Service) InList(idPerson string, personsId []string) bool {
    for _, personsId := range personsId {
        if id == idPerson {
            return true
        }
    }

    return false
}
服务是在类顶部定义的结构

这是我写的测试:

func TestValidatePersonID(t *testing.T) {
   personID := "12345"

   personIDs := []string{"12345", "123456t", "1234567a"}

   ok := *Service.InList(personID, personIDs)

   if !ok {
      t.Errorf("Id %v not found", personID)
   }
}
如果我尝试在没有*的情况下呼叫服务,则会出现错误:

无效的方法表达式需要指针接收器


如果我尝试调用函数*Service.inList,它会说我缺少一个参数。如果有人能指出我做错了什么,以及我如何在测试中获得该服务的指针接收器,我就是新手?。我很欣赏。

您必须在其接收器类型的实例上调用一个方法。因此,对于在*服务上定义的方法,必须在*服务的实例上调用它:

然而,在您的情况下,没有理由将此作为一种方法;它似乎和它的接收器没有任何关系,它从不引用它,所以它可能只是一个常规函数。还要注意的是,在围棋中给接受者命名是很不自然的


我还强烈建议至少采用交互式示例,其中详细介绍了编写方法。

的正确语法是:

此代码段添加nil作为接收方参数,并使用括号正确指定类型

这个问题中使用的方法不是惯用的。或者对值调用一个方法

s := Service{}
ok := s.InList(personID, personIDs)

或者将该方法转换为函数。

如果不引用接收器对象,则不应使用接收器对象,请尽可能简化代码

有三种编写方法或函数的方法,每种方法都有自己的目的

如果没有接收者,当函数中没有引用接收者时,我们称之为函数 一个值接收者,接收者被引用,但在我们称之为方法的方法中没有改变 指针接收器,接收器中的某些内容将在方法中更改
虽然在技术上是准确的,但这并不是一个在野外经常看到的构造。在实际的nil指针上调用方法比将方法作为这样的函数调用更常见。请不要说出这个名字。
ok := (*Service).InList(nil, personID, personIDs)
s := Service{}
ok := s.InList(personID, personIDs)