Go 语言学习之 method

简介: Go 语言学习之 method

01

概念


method 和函数类似,只是在函数名字前面多了一个参数,这个参数把这个 method 绑定到这个参数对应的类型上。


函数名字前面多的这个参数,我们称之为 method 的接收者,接收者名字最好能够选择简短且在整个 method 中名称始终保持一致的名字。通常的做法是取类型名字的首字母作为接收者名字。


因为 method 和成员变量的字段同属于一个命名空间,所以在 struct 类型中成员变量的字段名不能和 method 名字相同。否则会报编译错误。


因为每个类型有它自己的命名空间,所以我们可以在其它不同类型中使用相同的 method 名字。


在 Go 语言中,除了指针类型和接口类型之外,在同一个包下的其他任何类型都可以声明 method。


实参接收者会复制整个实参变量,如果实参变量太大,或者我们需要更新接收者变量,我们可以使用指针传递变量的地址。


method 的接收者允许 nil 指针作为实参,尤其是 map 和 slice 类型,其零值就是 nil 的类型。


02

实参接收者的 method


通过代码,我们演示实参接收者的 method。

type user struct {
  uid   int
  uname string
  age   uint16
}
func (u *user) eat() string {
  str := fmt.Sprintf("I am %s, I am eating now.\n", u.uname)
  return str
}
func main() {
  u1 := &user{
    uid:   2,
    uname: "lily",
    age:   19,
  }
  eater := u1.eat()
  fmt.Println(eater)
  fmt.Println(*u1)
  fmt.Println(u1)
}


03

指针接收者的 method


通过代码,我们演示指针接收者的 method。

type user struct {
  uid   int
  uname string
  age   uint16
}
func (u *user) eat() string {
  str := fmt.Sprintf("I am %s, I am eating now.\n", u.uname)
  return str
}
func main() {
  u1 := &user{
    uid:   2,
    uname: "lily",
    age:   19,
  }
  eater := u1.eat()
  fmt.Println(eater)
  fmt.Println(*u1)
  fmt.Println(u1)
}

提示:

在实际 Go 语言项目开发中,struct 类型的任何一个方法使用指针接收者,通常此类型的所有方法都应该使用指针接收者,不管方法需不需要使用指针接收者。


04

struct 内嵌匿名字段的 method


内嵌匿名字段可以方便地使用匿名字段的所有字段和方法,通过这种方式,可以组成复杂类型,每个匿名字段提供一些方法。


内嵌匿名字段可以是指向命名类型的指针,字段和方法间接地来自于指针指向的对象。


struct 类型可以拥有多个匿名字段,这个类型的值可以拥有所有字段的方法,和它自身声明的方法,在调用方法时,编译器选择方法的优先级从高往低依次是自身声明的方法、内嵌字段的方法、内嵌字段的内嵌字段的方法,在同一个层级有同名方法时,编译器会报错。


05

method 变量与 method表达式


method 变量是指将接收者的一个方法赋予一个变量,method 变量通常用于函数调用者期望函数的行为是调用一个特定接收者的 method。


method 表达式是指在调用 method 的时候,必须要提供接收者,把方法的接收者替换成函数的第一个形参,使它可以像函数一样调用。通常用于需要一个值代表属于同一个类型的多个 method 中的一个,method 变量可以帮助你调用这个值所对应的方法来处理不同的接收者。





目录
相关文章
|
4月前
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
|
3月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
260 1
|
4月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
11月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
11月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
5月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
356 1
|
4月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
5月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
444 0
|
5月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
300 0
|
5月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
303 0

热门文章

最新文章