非零基础自学Golang第9章结构体9.5结构体方法-创新互联

非零基础自学Golang

成都创新互联长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为济水街道企业提供专业的成都做网站、成都网站建设,济水街道网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。文章目录
      • 非零基础自学Golang
      • 第9章 结构体
        • 9.5 结构体方法
          • 9.5.1 指针类型接收者
          • 9.5.2 值类型接收者

第9章 结构体 9.5 结构体方法

Go语言中,一个方法就是一个包含了接收者的函数。

对于结构体方法,接收者可以是结构体类型的值或是指针。

9.5.1 指针类型接收者

当接收者类型为指针时,可以通过该方法改变该接收者的成员变量值,即使你使用了非指针类型实例调用该函数,也可以改变实例对应的成员变量值。

在以下示例中,我们为User结构体创建了ChangeName方法,在该方法内部将接收者的Name值修改为Tom,接收者的类型为指针类型:

[ 动手写9.5.1 ]

package main

import "fmt"

type User struct {Name  string
   Email string
}

func (u *User) ChangeName() {// 指针类型接收者
   u.Name = "Tom"
}

func main() {u := &User{"Peter", "go@go.com"} // 创建指针类型结构体实例
   fmt.Println("Name: ", u.Name, " Email: ", u.Email)

   u.ChangeName()
   fmt.Println("Name: ", u.Name, " Email: ", u.Email)
   
}

运行结果

在这里插入图片描述

只要结构体方法的接收者为指针类型,即使实例不是指针类型,修改也能生效:

[ 动手写 9.5.2 ]

package main

import "fmt"

type User struct {Name  string
   Email string
}

func (u *User) ChangeName() {// 指针类型接收者

   u.Name = "Tom"
}

func main() {u := User{"Peter", "go@go.com"} // 创建非指针类型结构体实例
   fmt.Println("Name: ", u.Name, " Email: ", u.Email)
   u.ChangeName()
   fmt.Println("Name: ", u.Name, " Email: ", u.Email)
   
}

运行结果

在这里插入图片描述

9.5.2 值类型接收者

当接收者不是一个指针时,该方法操作对应接收者值的副本,否则即使你使用了指针调用函数,也无法改变成员变量值。

[ 动手写 9.5.3]

package main

import "fmt"

type User struct {Name  string
   Email string
}

func (u User) ChangeName() {// 值类型接收者

   u.Name = "Tom"
}

func main() {u := &User{"Peter", "go@go.com"} //创建指针类型结构体实例

   fmt.Println("Name: ", u.Name, " Email: ", u.Email)

   u.ChangeName()
   fmt.Println("Name: ", u.Name, " Email: ", u.Email)
   
}

运行结果

在这里插入图片描述

如果方法需要修改接收者,接收者必须是指针类型。一般约定的接收者命名是类型的一个或两个字母的缩写(如u或者us之于User)。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站名称:非零基础自学Golang第9章结构体9.5结构体方法-创新互联
网页地址:http://azwzsj.com/article/ceddog.html