Reputation: 83
I have just started studying golang and during reading specification I found some question that I can't resolve by myself. In the section about method declaration the language specification says "If the base type is a struct type, the non-blank method and field names must be distinct."
https://golang.org/ref/spec#Method_declarations
As I understood, method with blank name is
func (t T) _() {
// some cool code
}
So, how can I use it and what is main purpose of such methods?
Upvotes: 3
Views: 415
Reputation: 11
"There is no real purpose of having blank method names,"
This statement is false.
There are real purposes for blank methods in go. They are compiled by the compiler at compilation time, and hence code validity is checked. It is used, for example, in code generation (go:generate foobar
). The code generation can add _(){} method and be sure there is no conflicts (in method names) and that the compiler will validate the code.
Here is an example from the official go: stringer. The tool generates blank methods for 'checks'
//this code compiles - blank methods do not 'conflict'
func _(){fmt.Println("")}
func _(){fmt.Println("")}
func _(){fmt.Println("")}
Upvotes: 1
Reputation: 418127
There is no real purpose of having blank method names, and you can't call them in any way (not even via reflection, they won't appear among the (exported) methods of the type, see on the Go Playground). It's just not explicitly forbidden by the language spec.
The method name is:
MethodName = identifier .
A method name can be anything that is a valid identifier:
identifier = letter { letter | unicode_digit } . letter = unicode_letter | "_" . unicode_letter = /* a Unicode code point classified as "Letter" */ . unicode_digit = /* a Unicode code point classified as "Number, decimal digit" */ .
The phrase "the non-blank method and field names must be distinct" just means the method (and field) names must be distinct, but you may add 2 separate blank methods, they don't collide. Blank methods don't have a name that would collide with anything, including other blank methods.
Upvotes: 9