Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Explanation of checking if value implements interface

I've read "Effective Go" and other Q&As like this: golang interface compliance compile type check , but nonetheless I can't understand properly how to use this technique.

Please, see example:

type Somether interface {     Method() bool }  type MyType string  func (mt MyType) Method2() bool {     return true }  func main() {     val := MyType("hello")      //here I want to get bool if my value implements Somether     _, ok := val.(Somether)     //but val must be interface, hm..what if I want explicit type?      //yes, here is another method:     var _ Iface = (*MyType)(nil)     //but it throws compile error     //it would be great if someone explain the notation above, looks weird } 

Is there any simple ways (eg without using reflection) check value if it implements an interface?

like image 385
Timur Fayzrakhmanov Avatar asked Jan 06 '15 17:01

Timur Fayzrakhmanov


People also ask

How do you know if a class implements an interface?

To declare a class that implements an interface, you include an implements clause in the class declaration. Your class can implement more than one interface, so the implements keyword is followed by a comma-separated list of the interfaces implemented by the class.

How do you check if an object implements an interface Typecript?

Use a user-defined type guard to check if an object implements an interface in TypeScript. The user-defined type guard consists of a function, which checks if the passed in object contains specific properties and returns a type predicate.

How do you check if an object is an instance of an interface?

The java “instanceof” operator is used to test whether the object is an instance of the specified type (class or subclass or interface). It is also known as type comparison operator because it compares the instance with type. It returns either true or false.


2 Answers

You only have to check if a value implements an interface if you don't know the value's type. If the type is known, that check is automatically done by the compiler.

If you really want to check anyways, you can do it with the second method you gave:

var _ Somether = (*MyType)(nil) 

which would error at compile time:

prog.go:23: cannot use (*MyType)(nil) (type *MyType) as type Somether in assignment:     *MyType does not implement Somether (missing Method method)  [process exited with non-zero status] 

What you are doing here, is assigning a pointer of MyType type (and nil value) to a variable of type Somether, but since the variable name is _ it is disregarded.

If MyType implemented Somether, it would compile and do nothing

like image 107
Dean Elbaz Avatar answered Nov 09 '22 00:11

Dean Elbaz


Following will work:

val:=MyType("hello") var i interface{}=val v, ok:=i.(Somether) 
like image 32
Alpha Avatar answered Nov 08 '22 23:11

Alpha