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 }
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.
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)But if we try to assign a value of type
*mytype to
stringer , everything works fine:
s = &m fmt.println(s)We get the expected result (try it on
go playground):
something
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.
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 againAn 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 = &m2We can also make it work if we embed
*mytype and just use
non-pointers mytype2 (go to the playground in
):
type mytype2 struct {
*mytype
}
m := mytype{value: "something"}
m2 := mytype2{mytype: &m}
var s stringer
s = m2
Also, no matter what we embed (
or *mytype
), if we use the pointer *mytype2
, it will always work (in GOAGUN
):
type mytype2 struct {
*mytype
}
m := mytype{value: "something"}
m2 := mytype2{mytype: &m}
var s stringer
s = &m2
Relevant sections in the specification (from the
section):
给定一个结构体类型 换句话说:如果我们嵌入一个非指针类型,非指针嵌入器的方法集只能获取具有非指针接收器的方法(来自嵌入类型)。 如果我们嵌入一个指针类型,非指针嵌入器的方法集将获取具有指针和非指针接收器的方法(来自嵌入类型)。 如果我们使用指向嵌入器的指针值,则无论嵌入类型是否是指针,指向嵌入器的指针的方法集始终都会获取具有指针和非指针接收器的方法(从嵌入类型)。 注意: 有一个非常相似的情况,即当您有一个包含 运行时恐慌(在 go playground 上尝试一下): 尝试转换而不是类型断言,我们得到了我们正在讨论的编译时错误: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))
panic: interface conversion: main.mytype is not main.stringer:
missing method string
m := MyType{value: "something"}
fmt.Println(Stringer(m))
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!

Golang is suitable for rapid development and concurrent programming, while C is more suitable for projects that require extreme performance and underlying control. 1) Golang's concurrency model simplifies concurrency programming through goroutine and channel. 2) C's template programming provides generic code and performance optimization. 3) Golang's garbage collection is convenient but may affect performance. C's memory management is complex but the control is fine.

Goimpactsdevelopmentpositivelythroughspeed,efficiency,andsimplicity.1)Speed:Gocompilesquicklyandrunsefficiently,idealforlargeprojects.2)Efficiency:Itscomprehensivestandardlibraryreducesexternaldependencies,enhancingdevelopmentefficiency.3)Simplicity:

C is more suitable for scenarios where direct control of hardware resources and high performance optimization is required, while Golang is more suitable for scenarios where rapid development and high concurrency processing are required. 1.C's advantage lies in its close to hardware characteristics and high optimization capabilities, which are suitable for high-performance needs such as game development. 2.Golang's advantage lies in its concise syntax and natural concurrency support, which is suitable for high concurrency service development.

Golang excels in practical applications and is known for its simplicity, efficiency and concurrency. 1) Concurrent programming is implemented through Goroutines and Channels, 2) Flexible code is written using interfaces and polymorphisms, 3) Simplify network programming with net/http packages, 4) Build efficient concurrent crawlers, 5) Debugging and optimizing through tools and best practices.

The core features of Go include garbage collection, static linking and concurrency support. 1. The concurrency model of Go language realizes efficient concurrent programming through goroutine and channel. 2. Interfaces and polymorphisms are implemented through interface methods, so that different types can be processed in a unified manner. 3. The basic usage demonstrates the efficiency of function definition and call. 4. In advanced usage, slices provide powerful functions of dynamic resizing. 5. Common errors such as race conditions can be detected and resolved through getest-race. 6. Performance optimization Reuse objects through sync.Pool to reduce garbage collection pressure.

Go language performs well in building efficient and scalable systems. Its advantages include: 1. High performance: compiled into machine code, fast running speed; 2. Concurrent programming: simplify multitasking through goroutines and channels; 3. Simplicity: concise syntax, reducing learning and maintenance costs; 4. Cross-platform: supports cross-platform compilation, easy deployment.

Confused about the sorting of SQL query results. In the process of learning SQL, you often encounter some confusing problems. Recently, the author is reading "MICK-SQL Basics"...

The relationship between technology stack convergence and technology selection In software development, the selection and management of technology stacks are a very critical issue. Recently, some readers have proposed...


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

Zend Studio 13.0.1
Powerful PHP integrated development environment

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.