Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cast a struct pointer to interface pointer in Golang

I have a function

func doStuff(inout *interface{}) {
   ...
}

the purpose of this function is to be able to treat a pointer of any type as input. But when I want to call it with a the pointer of a struct I have an error.

type MyStruct struct {
    f1 int
}

When calling doStuff

ms := MyStruct{1}
doStuff(&ms)

I have

test.go:38: cannot use &ms (type *MyStruct) as type **interface {} in argument to doStuff

How can I cast &ms to be compatible with *interface{}?

like image 757
taharqa Avatar asked Nov 27 '14 21:11

taharqa


People also ask

Can a struct implement an interface Golang?

We can define interfaces considering the different actions that are common between multiple types. In Go, we can automatically infer that a struct (object) implements an interface when it implements all its methods.

Can an interface be a pointer Golang?

Go's interface values are really a pair of pointers. When you put a concrete value into an interface value, one pointer starts pointing at the value. The second will now point to the implementation of the interface for the type of the concrete value.

Is struct a pointer in Golang?

Access struct using pointer in Golang In the above example, we have used the struct type pointer to access struct members: ptr.name - gives the value of the name member.

Is a struct an interface Golang?

Structs and interfaces are Go's way of organizing methods and data handling. Where structs define the fields of an object, like a Person's first and last name. The interfaces define the methods; e.g. formatting and returning a Person's full name.


1 Answers

There is no such thing as a "pointer to an interface" (technically, you can use one, but generally you don't need it).

As seen in "what is the meaning of interface{} in golang?", interface is a container with two words of data:

  • one word is used to point to a method table for the value’s underlying type,
  • and the other word is used to point to the actual data being held by that value.

interface

So remove the pointer, and doStuff will work just fine: the interface data will be &ms, your pointer:

func doStuff(inout interface{}) {    ... } 

See this example:

ms := MyStruct{1} doStuff(&ms) fmt.Printf("Hello, playground: %v\n", ms) 

Output:

Hello, playground: {1} 

As newacct mentions in the comments:

Passing the pointer to the interface directly works because if MyStruct conforms to a protocol, then *MyStruct also conforms to the protocol (since a type's method set is included in its pointer type's method set).

In this case, the interface is the empty interface, so it accepts all types anyway, but still.

like image 170
VonC Avatar answered Sep 25 '22 03:09

VonC