GO 语言自己比较智能(对传递参数能够自动识别,转换,对于接口就会有编译错误)。
接口的理论:传过去【赋值】的对象必须实现了接口要求的方法,而t1没有实现M2(),t1的指针实现了M2()
先声明一个结构体:
type T struct {
Name string
}
func (t T) M1() {
t.Name = "name1"
}
func (t *T) M2() {
t.Name = "name2"
}
type Intf interface {
M1()
M2()
}
M1() 的接收者是值类型 T, M2() 的接收者是值类型 *T , 两个方法内都是改变Name值。
下面声明一个 T 类型的变量,并调用 M1() 和 M2() 。
t1 := T{"t1"}
fmt.Println("M1调用前:", t1.Name)
t1.M1()
fmt.Println("M1调用后:", t1.Name)
fmt.Println("M2调用前:", t1.Name)
t1.M2()
fmt.Println("M2调用后:", t1.Name)
输出结果为:
M1调用前: t1
M1调用后: t1
M2调用前: t1
M2调用后: name2
下面声明一个 *T 类型的变量,并调用 M1() 和 M2() 。
t2 := &T{"t2"}
fmt.Println("M1调用前:", t2.Name)
t2.M1()
fmt.Println("M1调用后:", t2.Name)
fmt.Println("M2调用前:", t2.Name)
t2.M2()
fmt.Println("M2调用后:", t2.Name)
输出结果为:
M1调用前: t2
M1调用后: t2
M2调用前: t2
M2调用后: name2
分享到:
相关推荐
4. **使用 reflect 探究 struct 成员方法接收者指针** - Go 语言的反射库 `reflect` 提供了在运行时检查和操作类型的能力。当处理struct的方法时,如果方法的接收者是结构体的指针,那么反射可以让我们在运行时动态...
Go语言中的方法接收者可以是值或指针,但使用指针作为接收者可以使得方法直接修改对象的状态,适用于那些包含大量数据的结构体。例如: ```go type Person struct { name string age int } func (p *Person) Set...
3.使用指针接收者 package main import "fmt" // 定义一个名为 Counter 的结构体 type Counter struct { Count int } // 为 Counter 结构体定义一个方法,增加计数 func (c *Counter) Increment() { c.Count++ }...
项目名称"Learn Go with Tests"表明它的核心教学方法是通过测试驱动开发(TDD)来深入理解Go语言的语法和特性。其中,"Pointers and errors"部分专注于讲解Go中的指针和错误处理机制,这两个概念对于任何Go程序员来...
这个开源项目对于Go语言的初学者和资深开发者都有一定的学习价值,它可以教会我们如何扩展和定制Go语言的工具链,以及如何处理网络I/O和用户界面交互。同时,它也反映了Go社区对提升开发体验的关注,这也是开源精神...
在Go语言中,方法是与特定类型关联的函数,它们允许我们为自定义类型增加行为。方法值和方法表达式是两种不同的方法调用方式,它们在处理接收者时有所区别。 1. **方法值**: 方法值是指将一个方法绑定到结构体...
在Golang中,方法是与特定类型关联的函数,接收者(receiver)是方法的第一个参数,它可以是该类型的实例或其指针。接收者类型决定了方法的行为,特别是当涉及到值的复制和对对象的直接修改时。本文将深入探讨接收者...
- 方法:在类型上定义函数,支持值接收者和指针接收者。 - 接口:实现接口可以实现多态,接口的零值是 nil。 - 头等函数:函数可以作为其他函数的参数,或者作为其他函数的返回值。 - 匿名函数和闭包:可以定义...
在Go语言中,我们通过结构体和方法实现封装,利用值和指针接收者来控制对对象状态的访问,同时利用隐式取地址和`nil`接收者调用来简化编程。理解这些概念对于熟练掌握Go语言的面向对象编程至关重要。
- **自动生成指针接收者方法**:Go语言会自动为值类型接收者的方法生成对应的指针类型接收者方法。 #### 十三、接口 **13.1 定义** - 接口是由方法签名组成的集合。 **13.2 声明** - 使用`type`关键字声明接口...
它确保参数的类型与函数签名匹配,并处理可变参数、接收者等复杂情况。 9. **lookup.go** - `lookup.go`实现了查找和解析标识符在程序中的具体定义的功能。它涉及到了符号表的管理和查找算法,使得在大型代码库中...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型且具有垃圾回收功能的编程语言。Go语言的设计理念是简洁、高效和可移植,它结合了C语言的执行效率和Python语言的简洁性。"go-by-example.zip...
4. 指针接收者的方法可以修改接收者对象的值,而非指针接收者的方法则不能。 理解这些概念对于编写 Go 语言的程序至关重要,因为它允许我们以面向对象的方式组织代码,同时保持语言的简洁性和高效性。在实际工程中...
Go语言中的方法定义必须有一个接收者,这个接收者可以是值类型或者指针类型。如果方法的接收者是结构体指针,那么该方法可以直接修改结构体内容,无需拷贝。例如: ```go func (p *Person) incrementAge() { p....
首先,我们要知道Go语言中,当我们调用一个方法时,如果接收者是结构体类型(非指针),那么实际上会创建该结构体的一个副本,然后将副本传递给方法。这意味着在副本方法中,任何对结构体成员的修改都不会影响到原始...
在本文中,我们将深入探讨Go(也称为Golang)编程语言的基础知识,通过一组示例代码来引导初学者进入Go语言的世界。Go是由Google开发的一种静态类型、编译型、并发型、垃圾回收的现代编程语言,设计时考虑了并发性能...
方法接收者可以是值或指针,具体取决于是否需要修改结构体实例。例如,我们可以为`Person`定义一个打印个人信息的方法: ```go func (p Person) PrintInfo() { fmt.Printf("姓名:%s, 年龄:%d, 地址:%s\n", p....
同样,如果方法是指针接收者,但传递了一个值,Go会创建一个`&u`的临时指针,然后调用`(&u).notify()`。 3. **方法集**: 方法集是一个类型(T 或 *T)可以访问的所有方法的集合。理解方法集的概念很重要,因为它...