It seems quite basics, but I couldn't easily correct the below program https://play.golang.org/p/8IJn7g0m1As
import (
"fmt"
)
type A struct{ value int }
type B *A
func (b B) Print() {
fmt.Printf("Value: %d\n", b.value)
}
func main() {
a := &A{1}
b := new(B(a))
b.Print()
}
./prog.go:10:6: invalid receiver type B (B is a pointer type)
./prog.go:16:12: B(a) is not a type
For the first, I tried changing the receiver to func (b *B) , that didn't work.
For the second, I tried like &B{a}, that didn't work either.
A is actually a complex struct with mutex in it (a struct generated by protobuf), so I need to keep it as a pointer, at the same time need to define additional methods on it, so defining a new type B.
This is clearly forbidden by the language spec. Spec: Method declarations:
The receiver is specified via an extra parameter section preceding the method name. That parameter section must declare a single non-variadic parameter, the receiver. Its type must be a defined type
Tor a pointer to a defined typeT.Tis called the receiver base type. A receiver base type cannot be a pointer or interface type and it must be defined in the same package as the method.
You can't declare a method with receiver type *T where T is already a pointer type, and you also cannot add methods for types defined in other packages. The type declaration and the method declaration must be in the same package.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With