Golang 方法的结构指针接收者和结构值接收者
2017-12-26 10:36
309 查看
结构体
(1)结构指针接收者,顾名思义,会在方法内部改变该结构内部变量的值;(2)结构值接收者,在方法内部对变量的改变不会影响该结构。
示例如下:
type My struct { num int } func (self My) AddOne() { self.num++ } func (self *My) AddTwo() { self.num += 2 } func Test() { my1 := My{1} //值接收者 my1.AddOne() // 1 不改变num的值 fmt.Println(my1.num) my2 := &My{1}// 指针接收者 my2.AddTwo() // 3改变num的值 fmt.Println(my2.num) }
另外:
(3)对于指针接收者,如果你调用的是值方法,即使你是指针调用者,也不会改变你的结构内的变量值
(4)对于值接收者,如果你调用的是指针方法,即使你是值调用者,也会改变你的结构内的变量值
示例如下:
func Test() { my3 := My{1}// 值接收者 my3.AddTwo() // 3 改变num的值 fmt.Println(my3.num) my4 := &My{1}// 指针接收者 my4.AddOne() // 1 不改变num的值 fmt.Println(my4.num) }
接口
type Valueer interface { printf() } type Value1 struct { num int } type Value2 struct { num int } func (self *Value1) printf() { fmt.Println(self.num) } func (self *Value2) printf() { fmt.Println(self.num) } func testValue() { var te1 Valueer te1 = Value1{1} te1.printf() var te2 Valueer te2 = Value2{1} te2.printf() }
上述代码编译出错:
说明一个结构实现了接口的指针接收方法的话,将该结构的值赋值给接口是不行的,他不能找到该方法。
具体的语言规范里定义的规则如下:
类型 *T 的可调用方法
4000
集包含接受者为 *T 或 T 的所有方法集
这条规则说的是如果我们用来调用特定接口方法的接口变量是一个指针类型,那么方法的接受者可以是值类型也可以是指针类型.
类型 T 的可调用方法集包含接受者为 T 的所有方法
由以上两条规则,知道我们不符合这两条规则。
更改如下:
func testValue() { var te1 Valueer te1 = &Value1{1} te1.printf() var te2 Valueer te2 = &Value2{1} te2.printf() }
引用 :https://studygolang.com/articles/1113
相关文章推荐
- Golang:使用reflect探究struct成员方法接收者指针
- Vb.net调用C写的Dll含结构体指针参数的方法
- Golang中数据结构Queue的实现方法详解
- 程序员面试金典: 9.13 C和C++ 13.7编写方法,传入参数为指向Node结构的指针,返回传入数据结构的完整拷贝。
- go中方法的接收者是值或者指针区别
- go中方法的接收者是值或者指针有什么区别吗?
- 深入剖析 OC 中的方法结构 (isa指针的指向,以及元类的概念等)
- C#调用带结构体指针的C Dll的方法
- go中方法的接收者是值或者指针有什么区别吗?
- 编写方法,传入参数为指向Node结构的指针,返回传入数据结构的完整拷贝。
- C#调用C++中带结构体指针的方法,憋了3个小时!
- golang 的指针和非指针方法的见解
- golang方法中receiver为指针与不为指针的区别详析
- 关于接收者为指针的方法
- 结构体内可以包含自身的指针(链表实现方法)或 引用 但不可以包含自身变量即递归 (因为这样一来结构体大小就无法确定了)
- Golang访问SQL like数据库(二)——sql package主要数据结构及方法
- go中方法的接收者是值或者指针有什么区别吗?
- Golang并发编程——安全传输引用和指针的方法
- go中方法的接收者是值或者指针的区别
- C++中使用基类指针调用派生类中定义的方法