Jak mogę się upewnić, że typ implementuje interfejs podczas kompilacji? Typowym sposobem na to jest brak przypisania do obsługi interfejsów tego typu, jednak mam kilka typów, które są tylko dynamicznie konwertowane. W czasie wykonywania generuje to bardzo mętne komunikaty o błędach, bez lepszej diagnostyki podanej dla błędów kompilacji. Bardzo trudno jest znaleźć w czasie wykonywania, że typy, które spodziewałem się obsługiwać interfejsy, w rzeczywistości nie działają.Upewnij się, że typ implementuje interfejs podczas kompilacji w Go
Odpowiedz
Zakładając, że pytanie dotyczy Go, np.
var _ foo.RequiredInterface = myType{} // or &myType{} or [&]myType if scalar
jako TLD sprawdzi to za Ciebie w czasie kompilacji.
Edycja: s/[*]/&/
EDIT2: s/obojętne/_/dzięki atom
Możesz napisać '_' zamiast' dummy'. –
Intryguje mnie notacja edycji w stylu sed. – Matt
jak poniżej:
http://play.golang.org/p/57Vq0z1hq0
package main
import(
"fmt"
)
type Test int
func(t *Test) SayHello() {
fmt.Println("Hello");
}
type Saluter interface{
SayHello()
SayBye()
}
func main() {
t := Saluter(new(Test))
t.SayHello()
}
przyniesie :
prog.go:19: cannot convert new(Test) (type *Test) to type Saluter:
*Test does not implement Saluter (missing SayBye method)
Nie podoba mi się pomysł popełnienia błędów przez kompilator poprzez umieszczenie linii fikcyjnych w kodzie głównym. To inteligentne rozwiązanie, które działa, ale wolę napisać test do tego celu.
Zakładając, że mamy:
type Intfc interface { Func() }
type Typ int
func (t Typ) Func() {}
Ten test pilnuje Typ
realizuje Intfc
:
package main
import (
"reflect"
"testing"
)
func TestTypes(t *testing.T) {
var interfaces struct {
intfc Intfc
}
var typ Typ
v := reflect.ValueOf(interfaces)
testType(t, reflect.TypeOf(typ), v.Field(0).Type())
}
// testType checks if type t1 implements interface t2
func testType(t *testing.T, t1, t2 reflect.Type) {
if !t1.Implements(t2) {
t.Errorf("%v does not implement %v", t1, t2)
}
}
Można sprawdzić wszystkich typów interfejsów i dodając je do TestTypes
funkcji. Testy pisania dla Go wprowadzono here.
Eh, nie. Zapisywanie przypadków testowych za pomocą refleksji tylko po to, aby uniknąć statycznego sprawdzania kompilatora nie jest zalecane. – zzzz
Co jest nie tak z tym? – Mostafa
Go jest statycznie napisanym językiem. Co jest nie tak ze statycznym sprawdzeniem typu? Dynamiczne sprawdzanie typu jest uzasadnione iff statyczne sprawdzanie typu nie jest możliwe, IMHO. – zzzz
package main
import (
"fmt"
)
type Sayer interface {
Say()
}
type Person struct {
Name string
}
func(this *Person) Say() {
fmt.Println("I am", this.Name)
}
func main() {
person := &Person{"polaris"}
Test(person)
}
func Test(i interface{}) {
//!!here ,judge i implement Sayer
if sayer, ok := i.(Sayer); ok {
sayer.Say()
}
}
Przykładowy kod jest tutaj: http://play.golang.org/p/22bgbYVV6q
W języku Go nie ma "narzędzia" oświadczenie projektu. Jedyny sposób, aby poprosić kompilator, aby sprawdził, czy typ T implementuje interfejs I, podejmując próbę przypisania (tak, fikcyjny :). Uwaga: Go lang rozróżnia metody zadeklarowane na strukturze i wskaźniku, użyj właściwego w sprawdzaniu przypisania!
type T struct{}
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
Przeczytaj FAQ dla informacji Why doesn't Go have "implements" declarations?
[http://play.golang.org/p/UNXt7MlmX8] (http://play.golang.org/p/UNXt7MlmX8), aby podświetlić różnicę między sprawdzaniem przydziału wskaźnika i struktury –
- 1. Java - Upewnij się, że obiekt implementuje interfejs jest
- 2. Sprawdzanie, czy typ implementuje ogólny interfejs
- 3. Upewnij się, że fgetcsv() odczytuje całą linię
- 4. Obiekt ogólny wymaga rzutowania, mimo że implementuje wymagany interfejs.
- 5. Interfejs Delphi implementuje
- 6. SQLiteDatabase „nie implementuje interfejs”
- 7. Zatrzymywanie potoku PowerShell, upewnij się, że koniec nazywa się
- 8. Ciągła integracja: upewnij się, że nowe zatwierdzenia są objęte testami.
- 9. Upewnij się, że instancja Type reprezentuje typ przypisany do konkretnej klasy
- 10. Sprawdź, czy obiekt implementuje interfejs
- 11. Upewnij się, że blokady synchronizowane Java są pobierane w kolejności?
- 12. Upewnij się, że podproces jest martwy w kakao
- 13. Java abstrakcyjna klasa implementuje interfejs
- 14. Nie można uruchomić node_modules/.bin/browserifyinc. Upewnij się, że zainstalowałeś go z npm
- 15. Nie można znaleźć typu [System.IO.Compression.CompressionLevel] upewnij się, że zestaw zawierający ten typ jest załadowany
- 16. Sprawdź, czy obiekt implementuje interfejs
- 17. Upewnij się, że ciąg jest poprawną nazwą CSS o nazwie
- 18. wątek wyjątek bezpieczeństwa priorytetem upewnij się, że APK jest podpisany
- 19. Upewnij się, że obiekty są zamknięte, jeśli zostanie zgłoszony wyjątek.
- 20. Upewnij się, że parametr szablonu jest klasą wyliczeniową
- 21. Upewnij się, że dokładnie jedna boolean danej listy jest prawdziwa?
- 22. Upewnij się, że tabela SQLite ma tylko jeden wiersz
- 23. Nie można wyrejestrować xxx typ biblioteki - nie można załadować pliku, upewnij się, że jest to ważna biblioteka typ
- 24. Ogólny interfejs implementujący klasy kończy się niepowodzeniem.
- 25. mapa do klasy, która implementuje interfejs
- 26. W Delphi można powiązać interfejs z obiektem, który go nie implementuje.
- 27. Ostrzeżenie o nieobsługiwany typ klasy podczas kompilacji
- 28. Jak sprawdzić, czy jeden typ .NET implementuje pewien interfejs .NET w sposób abstrakcyjny?
- 29. Ogólna klasa rozszerzająca ORAZ implementuje interfejs
- 30. Implementuje interfejs Java za pomocą Spring (AOP?)
w jakim języku? – EJP
@EJP: powinno być _go_, język google – themarcuz