方法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. CentOS 6.5 伪分布安装

    CentOS 6.5 伪分布安装 软件准备  jdk-6u24-linux-i586.bin .hadoop-1.2.1.tar.gz.hadoop-eclipse-plugin-1.2.1.jar ...

  2. ASP.NET Web API 框架研究 IoC容器 DependencyResolver

    一.概念 1.IoC(Inversion of Control),控制反转 即将依赖对象的创建和维护交给一个外部容器来负责,而不是应用本身.如,在类型A中需要使用类型B的实例,而B的实例的创建不是由A ...

  3. poj1321 DFS

    棋盘问题 Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java class n ...

  4. OS基础:动态链接库(二)

    1.vc6.0新建工程MFC AppWizard[dll]工程 命名LptMfcDll1 2.在lptMfcDll1.h添加函数名声明 添加的代码: //lptAddBegin void lptMfc ...

  5. Windows 7 系统中开启 ASP.NET State Service 服务的方法

    控制面板 -> 程序和功能 -> “打开或者关闭 Windows 功能”对话框 -> Internet 信息服务 -> 万维网服务 -> 应用程序开发功能 -> A ...

  6. c# 数据写入三菱PLC

    public void Data_Write_Value(int[] m_write_data)        {            int lSize = 2; string[] Address ...

  7. [C#]Dapper学习笔记

    1.安装,直接用nuget搜索Dapper就行,不过只支持框架4.5.1 2.数据库测试表 CREATE TABLE [dbo].[Student]( [ID] [bigint] NULL, ) NU ...

  8. 多个文本框录入,使用回车键替找Tab键

    为了快速把form的所有文框输入完毕,我们不必使用鼠标去focus文本框. 在html页中放几个文本框: <div class="DivInput"> <div& ...

  9. 如何查看 Ubuntu下已安装包版本号

    原文链接:https://www.cnblogs.com/the-tops/p/8350662.html 一个软件工具叫做apt-show-versions,通过apt-get安装: $sudo ap ...

  10. python中硬要写抽象类和抽象方法

    由于python没有抽象类.接口的概念,所以要实现这种功能得abc.py这个类库,具体方式如下: # coding: utf-8import abc #抽象类class StudentBase(obj ...