Table of Contents
Question content
Workaround
Home Backend Development Golang X does not implement Y (...method has a pointer receiver)

X does not implement Y (...method has a pointer receiver)

Feb 12, 2024 pm 11:27 PM

X 没有实现 Y(...方法有一个指针接收器)

In this article, php editor Xiaoxin will discuss a problem about X's failure to implement Y. In this problem, we used a pointer receiver approach. Through this method, we can better understand why X cannot achieve Y and find ways to solve this problem. In the following content, we will discuss this problem in detail and provide some solutions.

Question content

There have been several Q&A's on the "X does not implement Y (...method has a pointer receiver)" question, but for me , they seem to be talking about different things and don't apply to my specific situation.

So instead of making the question very specific, I'm making it broad and abstract - it seems like there are a few different situations that could cause this error to occur, can someone summarize it?

How to avoid this problem, and if it occurs, what are the possibilities? Thanks.

Workaround

This compile-time error occurs when you try to assign or pass (or convert) a concrete type to an interface type; and the type itself does not Implementing this interface only implements a pointer to the type.

Short summary: Assignment to a variable An interface type is valid if the assigned value implements the interface to which it is assigned. If its method set is a superset of the interface, it will implement it. The method set of pointer types includes methods with pointer and non-pointer receivers. The method set for non-pointer types only includes methods with non-pointer receivers.

Let’s look at an example:

type stringer interface {
    string() string
}

type mytype struct {
    value string
}

func (m *mytype) string() string { return m.value }
Copy after login

stringer The interface type has only one method: string(). Any value stored in interface value stringer must have this method. We also created a mytype and created a method mytype.string() with a pointerreceiver. This means that the string() method is in the method set of type *mytype, but not in mytype.

When we try to assign a value of

mytype to a variable of type stringer, we receive the following error:

m := mytype{value: "something"}

var s stringer
s = m // cannot use m (type mytype) as type stringer in assignment:
      //   mytype does not implement stringer (string method has pointer receiver)
Copy after login

But if we try to assign a value of type

*mytype to stringer , everything works fine:

s = &m
fmt.println(s)
Copy after login

We get the expected result (try it on

go playground):

something
Copy after login

So getting this compile time error requires:

    The assigned (or passed or converted)
  • non-pointervalue of a specific type
  • The interface type being assigned (or passed or converted)
  • Concrete types have the methods required by the interface, but have
  • pointer receivers

Possibility of solving the problem:

    A pointer to a value must be used and its method set will include methods with pointer receivers
  • Or the receiver type must be changed to
  • non-pointer, so the method set of the non-pointer concrete type will also contain the method (thereby satisfying the interface). This may or may not be possible, as if the method must modify the value, a non-pointer receiver is not an option.
Structure and embedding

When using

structures and embedding , it is usually not "you" implementing the interface (providing method implementations), but rather the type embedded in the struct. Just like this example:

type mytype2 struct {
    mytype
}

m := mytype{value: "something"}
m2 := mytype2{mytype: m}

var s stringer
s = m2 // compile-time error again
Copy after login

An error occurred when compiling again because the method set of

mytype2 does not contain the string() method embedded in mytype, only *mytype2 method set, so the following method is valid (go to the playground in ):

var s stringer
s = &m2
Copy after login

We can also make it work if we embed

*mytype and just use non-pointers mytype2 (go to the playground in ):

Also, no matter what we embed (

mytype

or *mytype), if we use the pointer *mytype2, it will always work (in GOAGUN):

Relevant sections in the specification (from the

Structural Types

section):

给定一个结构体类型 s 和一个名为 t 的类型,提升的方法包含在该结构体的方法集中,如下所示:

  • 如果 s 包含匿名字段 t,则 s*s 的方法集均包含接收者为 t 的提升方法。 *s 的方法集还包括接收者 *t 的提升方法。
  • 如果 s 包含匿名字段 *t,则 s*s 的方法集都包含接收者为 t*t 的提升方法。

换句话说:如果我们嵌入一个非指针类型,非指针嵌入器的方法集只能获取具有非指针接收器的方法(来自嵌入类型)。

如果我们嵌入一个指针类型,非指针嵌入器的方法集将获取具有指针和非指针接收器的方法(来自嵌入类型)。

如果我们使用指向嵌入器的指针值,则无论嵌入类型是否是指针,指向嵌入器的指针的方法集始终都会获取具有指针和非指针接收器的方法(从嵌入类型)。

注意:

有一个非常相似的情况,即当您有一个包含 mytype 值的接口值时,并且您尝试 类型断言 另一个接口值,stringer。在这种情况下,由于上述原因,断言将不成立,但我们会得到一个略有不同的运行时错误:

m := mytype{value: "something"}

var i interface{} = m
fmt.println(i.(stringer))
Copy after login

运行时恐慌(在 go playground 上尝试一下):

panic: interface conversion: main.mytype is not main.stringer:
    missing method string
Copy after login

尝试转换而不是类型断言,我们得到了我们正在讨论的编译时错误:

m := MyType{value: "something"}

fmt.Println(Stringer(m))
Copy after login

The above is the detailed content of X does not implement Y (...method has a pointer receiver). For more information, please follow other related articles on the PHP Chinese website!

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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are the vulnerabilities of Debian OpenSSL What are the vulnerabilities of Debian OpenSSL Apr 02, 2025 am 07:30 AM

OpenSSL, as an open source library widely used in secure communications, provides encryption algorithms, keys and certificate management functions. However, there are some known security vulnerabilities in its historical version, some of which are extremely harmful. This article will focus on common vulnerabilities and response measures for OpenSSL in Debian systems. DebianOpenSSL known vulnerabilities: OpenSSL has experienced several serious vulnerabilities, such as: Heart Bleeding Vulnerability (CVE-2014-0160): This vulnerability affects OpenSSL 1.0.1 to 1.0.1f and 1.0.2 to 1.0.2 beta versions. An attacker can use this vulnerability to unauthorized read sensitive information on the server, including encryption keys, etc.

How do you use the pprof tool to analyze Go performance? How do you use the pprof tool to analyze Go performance? Mar 21, 2025 pm 06:37 PM

The article explains how to use the pprof tool for analyzing Go performance, including enabling profiling, collecting data, and identifying common bottlenecks like CPU and memory issues.Character count: 159

How do you write unit tests in Go? How do you write unit tests in Go? Mar 21, 2025 pm 06:34 PM

The article discusses writing unit tests in Go, covering best practices, mocking techniques, and tools for efficient test management.

What is the problem with Queue thread in Go's crawler Colly? What is the problem with Queue thread in Go's crawler Colly? Apr 02, 2025 pm 02:09 PM

Queue threading problem in Go crawler Colly explores the problem of using the Colly crawler library in Go language, developers often encounter problems with threads and request queues. �...

What libraries are used for floating point number operations in Go? What libraries are used for floating point number operations in Go? Apr 02, 2025 pm 02:06 PM

The library used for floating-point number operation in Go language introduces how to ensure the accuracy is...

Transforming from front-end to back-end development, is it more promising to learn Java or Golang? Transforming from front-end to back-end development, is it more promising to learn Java or Golang? Apr 02, 2025 am 09:12 AM

Backend learning path: The exploration journey from front-end to back-end As a back-end beginner who transforms from front-end development, you already have the foundation of nodejs,...

How do you specify dependencies in your go.mod file? How do you specify dependencies in your go.mod file? Mar 27, 2025 pm 07:14 PM

The article discusses managing Go module dependencies via go.mod, covering specification, updates, and conflict resolution. It emphasizes best practices like semantic versioning and regular updates.

PostgreSQL monitoring method under Debian PostgreSQL monitoring method under Debian Apr 02, 2025 am 07:27 AM

This article introduces a variety of methods and tools to monitor PostgreSQL databases under the Debian system, helping you to fully grasp database performance monitoring. 1. Use PostgreSQL to build-in monitoring view PostgreSQL itself provides multiple views for monitoring database activities: pg_stat_activity: displays database activities in real time, including connections, queries, transactions and other information. pg_stat_replication: Monitors replication status, especially suitable for stream replication clusters. pg_stat_database: Provides database statistics, such as database size, transaction commit/rollback times and other key indicators. 2. Use log analysis tool pgBadg

See all articles