首先,在结构体中的值接受方法与指针接受方法,对于值类型或者指针类型的结构体实例都可以调用,如下:
type Gopher struct {
language string
}
func (g *Gopher) Str() string {
return fmt.Sprintf("我是指针接受方法:%s", g.language)
}
func (g Gopher) Tye() string {
return fmt.Sprintf("我是值接受方法:%s", g.language)
}
func main() {
var a = Gopher{language: "golang"}
fmt.Println(a.Str())
fmt.Println(a.Tye())
var b = &Gopher{language: "python"}
fmt.Println(b.Str())
fmt.Println(b.Tye())
}
上述申明了一个值类型实例a与指针类型实例b,去调用接受方法,都能正常输出,这是起到了语法糖作用,编译器会自动适应。
我是指针接受方法:golang
我是值接受方法:golang
我是指针接受方法:python
我是值接受方法:python
万事都有个但是,如果我们去用结构体实现接口里面的方法,是否也可以直接实现一个值类型接受方法与一个指针类型接方法,就如下面:
type Coder interface {
Str() string
Tye() string
}
type Gopher struct {
language string
}
func (g *Gopher) Str() string {
return fmt.Sprintf("我是指针接受方法:%s", g.language)
}
func (g Gopher) Tye() string {
return fmt.Sprintf("我是值接受方法:%s", g.language)
}
func main() {
var a Coder = Gopher{language: "golang"}
fmt.Println(a.Str())
fmt.Println(a.Tye())
}
上述实现结构方法,一个方法用指针类型实现,一个方法用指针类型方法。申明一个值类型的接口实例去调用:
./ticker.go:28:6: cannot use Gopher literal (type Gopher) as type Coder in assignment:
Gopher does not implement Coder (Str method has pointer receiver)
而如果申明一个指针类型的接口实例去调用:
func main() {
var b Coder = &Gopher{language: "golang"}
fmt.Println(b.Str())
fmt.Println(b.Tye())
}
我是指针接受方法:golang
我是值接受方法:golang
小朋友你是否有很多问好????
这里就引出一个go语言的语法糖:
如果实现了接受者是值类型的方法,会隐含的实现接受者是指针类型的方法。接受者是指针类型的方法,不能隐含实现接受者是值类型的方法。
所以上述中申明一个指针类型的接口实例b,其type()的值类型接受方法会隐含实现指针类型。
而声明一个值类型的接口实例a,str()的指针接受方法,不能自动隐含值类型接受方法,所以导致声明的值类型接口实例不能满足接口的实现条件。
网友评论