


Why Does Changing a Method Receiver from Pointer to Non-Pointer Lead to a Dead Loop When Using `fmt.Sprintf`?
Nov 16, 2024 am 01:10 AMUnderstanding the Difference Between t and *t
In this code snippet, we have a type TT with a String method that implements the fmt.Stringer interface:
package main import "fmt" type TT struct { a int b float32 c string } func (t *TT) String() string { return fmt.Sprintf("%+v", *t) } func main() { tt := &TT{3, 4, "5"} fmt.Printf(tt.String()) }
This code works because the fmt package invokes the String method to get the string representation of the TT value.
However, when the String method is modified to take a non-pointer receiver:
func (t *TT) String() string { return fmt.Sprintf("%+v", t) }
it causes a dead loop. Let's explain why:
Calling fmt.Sprintf("% v", t) passes a *TT (pointer to TT) value to the fmt package. Since the TT.String method has a pointer receiver, the fmt package will not find this method in the method set of the *TT type.
Changing the receiver to a non-pointer type means that the fmt package will find the String method in the method set of TT. However, this leads to infinite recursion because the method being called is the same one that is being used to format the value.
To avoid this issue, a new type can be created using the type keyword, effectively separating the receiver type from the value being passed to the fmt package:
func (t TT) String() string { type TT2 TT return fmt.Sprintf("%+v", TT2(t)) }
This works because the new type created by the type keyword doesn't have any methods, so the fmt package won't try to invoke the String method on the new type.
The above is the detailed content of Why Does Changing a Method Receiver from Pointer to Non-Pointer Lead to a Dead Loop When Using `fmt.Sprintf`?. For more information, please follow other related articles on the PHP Chinese website!

Hot tools Tags

Hot Article

Hot tools Tags

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

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Go language pack import: What is the difference between underscore and without underscore?

How do I write mock objects and stubs for testing in Go?

How to implement short-term information transfer between pages in the Beego framework?

How can I define custom type constraints for generics in Go?

How can I use tracing tools to understand the execution flow of my Go applications?

How can I use linters and static analysis tools to improve the quality and maintainability of my Go code?

How to write files in Go language conveniently?

How to convert MySQL query result List into a custom structure slice in Go language?
