Home > Backend Development > Golang > Why Can\'t I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?

Why Can\'t I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?

Linda Hamilton
Release: 2024-11-24 04:15:20
Original
619 people have browsed it

Why Can't I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?

Understanding Receiver Types for Go Interface Implementation

In Go, methods can have either value receivers (func (t T) m()) or pointer receivers (func (t *T) m()) for types struct. The receiver type determines the value that should be used when calling the method.

Consider the following code:

import "fmt"

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

func (t tourGuide) hello() {
    fmt.Println("Hello", t.name)
}

func (t *tourGuide) goodbye() {
    fmt.Println("Goodbye", t.name)
}

func main() {
    var t1 tourGuide = tourGuide{"James"}
    t1.hello() // Hello James
    t1.goodbye() // Goodbye James (same as (&t1).goodbye())

    var t2 *tourGuide = &tourGuide{"Smith"}
    t2.hello() // Hello Smith
    t2.goodbye() // Goodbye Smith (same as (*t2).hello())

    // illegal: t1 is not assignable to g1 (why?)
    // var g1 greeter = t1

    var g2 greeter = t2
    g2.hello() // Hello Smith
    g2.goodbye() // Goodbye Smith
}
Copy after login

You may wonder why you can call methods of tourGuide using either a variable t1 of type tourGuide or a pointer t2 of type *tourGuide, but you cannot assign t1 to an interface variable g1 of type greeter.

The reason lies in the receiver type of the interface methods. In this case, both hello and goodbye have pointer receivers. As such, only a pointer value can be used as the receiver value.

When you call t1.hello() and t1.goodbye(), the compiler automatically takes the address of t1 and uses that as the receiver, because t1 is an addressable value.

However, when you try to assign t1 to g1, the compiler sees that t1 is not a pointer value, but a value of type tourGuide. Interfaces are not addressable, so the compiler cannot take the address of t1 and assign it to g1.

In summary, pointer receivers require a pointer value to call the method, while value receivers can be called with either a value or pointer. When implementing interfaces with pointer receiver methods, only pointer values can be assigned to the interface.

The above is the detailed content of Why Can\'t I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template