Go问答 指针结构体的实现和值结构体的实现,有什么区别

381808964 · 2018年03月09日 · 最后由 keepeye 回复于 2018年03月12日 · 615 次阅读

指针结构体的实现和值结构体的实现,有什么区别 好像用起来一样的只是值结构体可以指针也可以值 这两种情况一般在什么场景下使用

type test interface {
   method()
}

type t1 struct {
  s string
}
func (t *t1)method(){
   fmt.Println(t.s)
}
type t2 struct{
   w string
}
func (t t2)method(){
   fmt.Println(t.w)
}

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

这个主要是 Go 中方法的接收者为值类型和指针类型的区别,一句话概括:值作为接收者(T)不会修改结构体值,而指针类型(*T)可以修改。

如果想了解更多关于方法的使用,可以参见我们录制的视频 Go 零基础编程入门教程-11 方法 或 电子书 method

https://gocn.io/question/1583, 参考一下这个帖子吧

指针结构体可以调用值结构体实现的方法,反之则不行

对结构体本身的影响,通过例子测一下就知道了

type Foo struct {
    Name string
}

func (f *Foo) Rename(newName string) {
    f.Name = newName
    fmt.Printf("%+v\n",f)
}

func main() {
    f := Foo{Name:"张三"}
    f.Rename("李四")
    fmt.Printf("%+v\n",f)
}

还有一种情况是影响到接口实现的,比如一个接口:

type Balala interface {
    Rename(newName string)
}

type Foo struct {
    Name string
}

func (f *Foo) Rename(newName string) {
    f.Name = newName
}

//这样创建的结构体对象f是没有实现Balala接口的,因为结构体定义的方法接收者是指针类型
f := Foo{}
//这样的是实现了接口
f := &Foo{}
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册