美文网首页
方法集与表达式

方法集与表达式

作者: 黎涛note | 来源:发表于2021-04-16 10:24 被阅读0次

Golang 表达式 :根据调用者不同,方法分为两种表现形式:

instance.method(args...) ---> <type>.func(instance, args...)  

前者称为 method value,后者 method expression。

两者都可像普通函数那样赋值和传参,区别在于 method value 绑定实例,而 method expression 则须显式传参。

package main

import "fmt"

type User struct {
    id int
    name string
}

type Manager struct {
    User//通过组合实现继承
    title string
}

func (u *User) ToString() string {
    return fmt.Sprintf("User: %p %v\n",u, u)
}

func (m *Manager) ToString() string  {
    return fmt.Sprintf("Manager: %p %v\n",m, m)
}

func (u *User) TestPointer() {
    fmt.Printf("TestPointer %p,%v\n",u, u)
}

func (u User) TestValue(){
    fmt.Printf("TestValue %p,%v\n",&u,u)
}

func main() {
    m := Manager{User{1,"Tom"},"Administrator"}
    fmt.Println(m.ToString())
    fmt.Println(m.User.ToString())
    fmt.Println("---------------------------------")
    u := User{1,"Tom"}
    u.TestValue()//u为{1,"Tom"}
    uValue := u.TestValue//uValue为当前u的方法,复制了u的值
    u.id,u.name = 2,"cat"//改变u的值
    u.TestValue()//u为改变的值
    uValue()//该方法为复制值的方法
    /* out
    TestValue 0xc0000040a8,{1 Tom}
    TestValue 0xc0000040d8,{2 cat}
    TestValue 0xc000004108,{1 Tom}
     */
    fmt.Println("---------------------------------")
    //总结:方法中的对象为值的拷贝,还是地址的传递,与方法本身的声明相关
    //与调用方法传递的类型无关
    //由于*T的方法包含了*T+T的方法所以可以调用
    u1 := User{1,"Tom"}
    fmt.Printf("u1 %p,%v\n",&u1,u1)
    mv := User.TestValue
    mv(u1)//由于方法有一个隐藏的this指针
    //mv中的u1是对主函数中u1的值拷贝,地址并不相同

    mp := (* User).TestPointer
    mp(&u1)//mp中的u1与主函数中u1是同一个内存且地址相同

    mp2 := (* User).TestValue
    mp2(&u1)//mp2中的u1是对主函数中u1的值拷贝,地址并不相同


}

相关文章

  • 方法集与表达式

    Golang 表达式 :根据调用者不同,方法分为两种表现形式: 前者称为 method value,后者 meth...

  • awk手册

    使用方法 例: 基本语法 模式与操作 模式可以是以下任意一个:/正则表达式/:使用通配符的扩展集。关系表达式:使用...

  • JDK1.8新增特性参考

    Lambda表达式 Stream函数式操作流元素集合 接口新增:默认方法与静态方法 方法引用,与Lambda表达式...

  • JS 正则表达式的使用 2022-06-07

    正则表达式有两种创建方法: 字面量正则表达式 创建RegExp对象的实例 匹配字符集匹配字符集使用的是[] 转义使...

  • 正则表达式

    1、创建正则表达式 2、test方法测试正则表达式 3、边界符 4、字符 5、量词符 6、简写字符集 7、repl...

  • Java8

    lambda表达式与方法引用 lambda表达式 一般形式: (a,b)->a+b; (a,b)->{ st...

  • JDK 8新特性—Lambda表达式

    Lambda表达式 简介: Lambda表达式本质上是一种匿名方法,能将该方法作为参数传入其他方法中,用法上与一个...

  • Go 语言程序设计——面向对象编程(3)

    方法表达式 我们也可以对方法表达式进行赋值和传递 方法表达式是一个必须将方法类型作为第一个参数的函数 方法表达式是...

  • go 接口

    精髓 《go语言实战》5.4.3方法集。要理解方法集的含义!方法集与接口密切相关。 代码清单 5-42 展示了规范...

  • 2-Python 基本的正则表达式

    本章概要:PyCharm的安装与配置正则表达式符号与方法正则表达式的应用举例实例--制作文本爬虫 1、PyChar...

网友评论

      本文标题:方法集与表达式

      本文链接:https://www.haomeiwen.com/subject/xlijlltx.html