方法method

  • Go中虽没有class,但依旧有method
  • 通过显示说明receiver来实现与某个类型的结合
  • 只能为同一个包中的类型定义方法
  • receiver可以是类型的值或者指针
  • 不存在方法重载
  • 可以使用值或指针来调用方法,编译器会自动完成转换
  • 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数(Method Value vs. Method Expression)
  • 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
  • 类型别名不会拥有底层类型所附带的方法
  • 方法可以调用结构中的非公开字段
package main

import (
"fmt"
) type A struct {
Name string
} type B struct {
Name string
} func main() {
a := A{}
a.Print()
b := B{}
b.Print()
} //编译器根据接收者的类型,来判断它是属于哪个方法
func (a A) Print() {
//取一个变量a,a就是接收者,它的接收者的类型就是structA,Print就是方法的名称,参数在Print()的括号中定义
//receiver就是这个函数的第一个接收者,而且是强制规定的,这个时候就变成了一个方法
fmt.Println("A")
}
func (b B) Print() {
fmt.Println("B")
}

receiver也是参数,涉及到指针传递还是值的传递

package main

import (
"fmt"
) type A struct {
Name string
} type B struct {
Name string
} func main() {
a := A{}
a.Print()
fmt.Println(a.Name)
b := B{}
b.Print()
fmt.Println(b.Name)
} //编译器根据接收者的类型,来判断它是属于哪个方法
func (a *A) Print() { //加上*代表指针传递
//取一个变量a,a就是接收者,它的接收者的类型就是structA,Print就是方法的名称,参数在Print()的括号中定义
//receiver就是这个函数的第一个接收者,而且是强制规定的,这个时候就变成了一个方法
a.Name = "AA"
fmt.Println("A")
}
func (b B) Print() { //这里的b并不是以指针传递
b.Name = "BB"
fmt.Println("B")
}
//结果所示:值类型不使用指针,在这个方法结束之后,值不会被修改
PS G:\mygo\src\mytest> go run .\temp4.go
A
AA
B

类型别名与方法的组合

package main

import (
"fmt"
) type TZ int func main() {
var a TZ
a.Print() }
func (a *TZ) Print() {
fmt.Println("TZ")
}

Method Value vs. Method Expression

package main

import (
"fmt"
) type TZ int func main() {
var a TZ
a.Print() //Method Value
(*TZ).Print(&a) //Method Expression 这是两种不同的调用方法 }
func (a *TZ) Print() {
fmt.Println("TZ")
}

方法访问权限

package main

import (
"fmt"
) type A struct {
mm string //首字母小写代表私有字段
//首字母的大小写还是以包为级别来界定它的公有还是私有
} func main() {
a := A{}
a.Print()
fmt.Println(a.mm) }
func (a *A) Print() {
a.mm = "123"
fmt.Println(a.mm)
} //打印结果证明方法当中可以访问结构当中的私有字段,类似与其他面向对象编程语言当中class中的方法可以访问其中的私有字段
PS G:\mygo\src\mytest> go run .\temp5.go
123
123

Golang 方法method的更多相关文章

  1. golang 方法接收者

    [定义]: golang的方法(Method)是一个带有receiver的函数Function,Receiver是一个特定的struct类型,当你将函数Function附加到该receiver, 这个 ...

  2. golang基础--method方法

    Go没有类似python语言中类class的概念,但依旧有method 类型方法定义格式如下 func (a mytype) method_name(x type)(y type){ return y ...

  3. Java反射-方法(Method)

    工作了三年,第二次使用反射! 遇到的问题描述: 多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好. 查询原因是因为查询数据的SQL为:to_char(a.applyAmount, ...

  4. 2.C#中泛型在方法Method上的实现

    阅读目录   一:C#中泛型在方法Method上的实现 把Persion类型序列化为XML格式的字符串,把Book类型序列化为XML格式的字符串,但是只写一份代码,而不是public static s ...

  5. 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method

    2.字段Field 2.1.通过Class实例获取字段field信息: getField(name): 获取某个public的field,包括父类 getDeclaredField(name): 获取 ...

  6. go语言中的方法method

    package main; import "fmt" //重新定义一个类型 //为该INT类型扩展方法 type INT int; type A struct { name str ...

  7. 提高java反射速度的方法method.setAccessible(true)

    转载:http://huoyanyanyi10.iteye.com/blog/1317614 提高java反射速度的方法method.setAccessible(true) package com.c ...

  8. 通过反射获取及调用方法(Method)

    1.获取方法使用反射获取某一个类中的方法,步骤:①找到获取方法所在类的字节码对象②找到需要被获取的方法 Class类中常用方法: public Method[] getMethods():获取包括自身 ...

  9. java Class中得到构造方法Constructor、方法Method、字段Field

    常用方法: Constructor类用于描述类中的构造方法: Constructor<T> getConstructor(Class<?>... parameterTypes) ...

随机推荐

  1. spring父子Ioc容器的关系

    在网上找了一下,没有直接解说ioc父子容器关系的文章,所以大概看了下代码,自己写下吧,写俩行做个笔记. 1. 在进行dean的注册的时候,父容器和子容器是互不干扰的,各自注册自己的 2. 在实例化的时 ...

  2. vc6中向vs2010迁移的几个问题(2)

    1. 库文件的迁移 参考:http://www.cnblogs.com/icmzn/p/6724969.html 2. 其他项目中的可能遇到的问题: 2.1 无法打开包括文件:“fstream.h”: ...

  3. shell 命令之 crontab

    crontab是shell命令中的定时任务: crontab -e 进入当前定时任务的vim页面 每行是一个独立的定时脚本,使用和vim的语法部署定时任务 如下图: 脚本执行周期设置 可以用下面的网页 ...

  4. CentOS7安装BugFree

    1. 安装apache yum install httpd 2. 安装mysql yum install mysql yum install mysql-server 注意: 1)已安装mysql的跳 ...

  5. C# 简单反射实现winform左侧树形导航,右侧切换内容

    先看看效果: 核心代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...

  6. 背水一战 Windows 10 (48) - 控件(集合类): FlipView

    [源码下载] 背水一战 Windows 10 (48) - 控件(集合类): FlipView 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类) FlipView 示例Fl ...

  7. charles捕获手机端请求数据

    charles是mac os中的一款类似于windows下fiddler的代理软件,个人感觉比fiddler功能强大:通过charles可以实现指定的请求响应.篡改请求内容.延迟请求.捕获手机端请求等 ...

  8. cad.net之ACAD移植到GCAD的自动加载问题

    将acad.pgp,lsp,fas,vlx,名称增加一份gcad.pgp,lsp,fas,vlx.涉及系统加载用. Lisp的拖拉加载在gcad无法通过lastprompt获取命令历史栏最后一行(含路 ...

  9. JavaScript 那些不经意间发生的数据类型自动转换

    JavaScript可以自由的进行数据类型转换,也提供了多种显式转换的方式.但是更多的情况下,是由JavaScript自动转换的,当然这些转换遵循着一定的规则,了解数据类型自由转换的规则是非常必要的. ...

  10. Mysql数据优化--DBA梳理珍藏篇

    1. 优化SQL 1)     通过show status了解各种sql的执行频率 show status like 'Com_%'        了解 Com_select,Com_insert 的 ...