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 变量可以帮助你调用这个值所对应的方法来处理不同的接收者。





目录
相关文章
|
3天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
16 2
|
8天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
7天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
28 7
|
7天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
28 5
|
6天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
20 1
|
6天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
81 58
|
5天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
6天前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
21 9
|
2天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
9 4
|
6天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
21 7