Pracuję nad testami jednostek w projekcie Go i jestem nowy, aby iść. Aby rozpocząć, chciałem przetestować coś łatwego. I zacząłem od tej funkcji:

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

    return false
}

Serwis jest strukturą zdefiniowaną na górze klasy.

To jest test, który napisałem:

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)
   }
}

Jeśli spróbuję zadzwonić do serwisu bez * dostaję błąd:

Nieprawidłowa ekspresja metody (wymaga odbiornika wskaźnika)

Jeśli spróbuję zadzwonić do funkcji (* Service) .inlist, mówi, że brakuje mi argumentu. Jestem nowy, aby pójść, jeśli ktokolwiek mógłby wskazać mi, co robię źle i jak mógłbym uzyskać odbiornik wskaźnika tej usługi w moim teście? Wdzięczam go.

go
-1
elcharrua 4 czerwiec 2018, 19:51

3 odpowiedzi

Najlepsza odpowiedź

Musisz zadzwonić do metody na instancji typu odbiornika. Więc, aby uzyskać metodę zdefiniowaną na *Service, musisz zadzwonić do tego na instancji *Service:

var foo *Service
foo = &Service{}
foo.InList(personID, personIDs)

Jednak w twoim przypadku nie ma powodu, aby był to metoda; Wydaje się, że nie ma nic wspólnego z jego odbiorcą (nigdy się nie odnosi), więc może to być regularna funkcja. Należy również pamiętać, że jest jednoznaczny do nazwy odbiornika {x0}} w podróży.

Gorąco polecam przynajmniej biorąc GO Tour, która obejmuje szczegółowo metody pisania, z interaktywnym przykłady.

1
Adrian 4 czerwiec 2018, 16:53

Prawidłowa składnia dla Metoda wyrażenie to:

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

Ten fragment dodaje nil jako argument odbiornika i wykorzystuje nawiasy, aby poprawnie określić typ.

Zbliżony w pytaniu nie jest idiomatyczny. Zadzwoń do metody na wartości

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

Lub konwertuj metodę funkcji.

2
Cerise Limón 4 czerwiec 2018, 17:00

Jeśli nie odniesiesz do obiektu odbiornika, nie powinieneś mieć jednego, zachowaj swój kod jako możliwy, jak to możliwe.

Istnieją trzy sposoby pisania metody lub funkcji, z każdym własnym celem.

  1. Bez odbiornika, gdy nie ma odbiornika, w funkcji nie ma odbiornika (nazywamy to funkcją)
  2. Odbiornik wartościowy, odbiornik jest odniesiony, ale nie zmienia się w metodzie (nazywamy to metodą)
  3. Odbiornik wskaźnika, coś w odbiorniku zostanie zmieniona w metodzie
0
Bert Verhees 4 czerwiec 2018, 20:54