Go_方法、方法重载

方法:

  • 方法是绑定在自定义类型上的,常用在结构体上

  • 方法只能通过绑定的自定义类型的变量来调用,方法不能直接调用,因为方法是和类型作关联的

  • 方法是值拷贝的传递方式,如果希望改变结构体变量的值,需要通过结构体指针实现

  • 方法名首字母大写为公共,小写为私有,与函数一致

创建格式:

func (对象 类型) 方法名 (参数列表) (返回值列表){}

调用:

对象.方法名

演示:方法是值拷贝,在方法中修改是不会影响原数据的

type Student struct {name string
}// 创建了一个StudentMethod方法,绑定了Student,可以称为Student的方法
// s是Student的变量,可以用来调用Student的成员
func (s Student) StudentMethod() {fmt.Println("我是Student的方法")fmt.Println("StudentMethod修改前:", s.name)s.name = "韩信"fmt.Println("StudentMethod修改后:", s.name)
}func main() {stu := Student{"itzhuzhu"}stu.StudentMethod() // 调用方法fmt.Println("main运行修改后:", stu.name)
}

输出:

我是Student的方法
StudentMethod修改前: itzhuzhu
StudentMethod修改后: 韩信
main运行修改后: itzhuzhu

三种不同调用的方式

type Student struct {name stringage  int
}func (s *Student) StudentMethod() {fmt.Println(*s)
}func main() {// 普通方式调用s := Student{name: "韩信", age: 99}s.StudentMethod()// 方法值调用x := s.StudentMethodx()fmt.Printf("查看数据类型:%T", x)// 方法表达式调用,要和方法对象的类型保持一致,方法对象是指针类型,这里也要加上*y := (*Student).StudentMethody(&s)
}

带参数的方法:

type Count struct{}func (c Count) count(n int) {result := 0for i := 0; i <= n; i++ {result += i}fmt.Println(result)
}func main() {c := Count{}c.count(100)
}

带参数和返回值的方法:返回x+y的和

type Count struct{}func (c Count) CountMethod(x, y int) int {return x + y
}func main() {c := Count{}// 调用的时候要先有一个变量接收,否则接收不到返回值countMethod := c.CountMethod(10, 20)fmt.Println(countMethod)
}

变量调用方法时,该变量也会作为一个参数传递到方法(如果是引用类型,则进行地址拷贝,否则为值拷贝)

type Test struct{}func (t Test) TestMethod(x, y int) int {/*这里的变量t和main方法中的变量t,不是同一个t,因为是值拷贝,所以main栈调用TestMethod方法时,会将main栈的t拷贝一份到TestMethod方法中,如果是指针,那么拷贝的是内存地址*/return x + y
}func main() {t := Test{}testMethod := t.TestMethod(1, 2)fmt.Println(testMethod)
}

指针类型使用方法

type Test struct {num int
}func (t *Test) TestMethod(x, y int) int {t.num = 2fmt.Println("TestMethod修改为2:", t.num)return x + y
}func main() {t := Test{}t.num = 1fmt.Println("传递TestMethod方法前:", t.num)testMethod := (&t).TestMethod(1, 2)fmt.Println("调用完方法后:", t.num)fmt.Println(&t)// 也可以简写成以下模式,因为编译器在底层做了优化,在编译时会自动加上(&)testMethod2 := t.TestMethod(1, 2)fmt.Println(testMethod)fmt.Println(testMethod2)
}

输出:

传递TestMethod方法前: 1
TestMethod修改为22
调用完方法后: 2
&{2}
TestMethod修改为22
3
3

方法可以作用在指定的数据类型上,所有的自定义类型都可以有方法,除struct外,int、float也可以有方法

type integer intfunc (i integer) print() {fmt.Println("print方法:", i)
}func (i *integer) change() {fmt.Println("change方法", i)
}
func main() {var i integer = 10i.print()i.change()fmt.Println("main方法:", i)
}

输出:

print方法: 10
change方法 0x14000124008
main方法: 10

如果一个类型实现了String()方法,那么输出时会默认调用String()

type Student struct {name stringage  int
}func (stu *Student) String() string {return "String方法执行"
}func main() {stu := Student{"不知火舞", 99}fmt.Println(&stu)
}

输出:

String方法执行

方法重写:

方法重写是父类中的方法与子类方法重名的问题,默认调用子类的方法,如果需要使用父类的,需要使用子类.父类.方法名调用

// 父类
type Person struct {name stringage  int
}func (p *Person) Show() {fmt.Println("我是Person的show方法")
}// 子类
type Student struct {Person
}func (s *Student) Show() {fmt.Println("我是Student的show方法")
}func main() {s := Student{Person{name: "韩信",age:  99,}}s.Show() // 优先使用自己的//如果需要使用父类的,需要明示使用父类调用s.Person.Show()
}

方法和函数的区别:

  1. 方法有接受者,而函数无接受者
  2. 函数不可以重名,而方法可以重名
  3. 调用方式不一样
函数:函数名(实参列表)
方法:变量.方法名(实参列表)
  1. 函数参数为值类型时不能传递指针类型,为指针类型时不能传递值类型。不管方法是值类型还是指针类型,都可以使用值或指针调用

注意:判断方法是否为指针类型,不应该从调用者出发 s.Test03(),是由方法关联类型决定的(h Hero) test03()、(h *Hero) test04()

type Hero struct {name string
}// 值类型函数
func test01(h Hero) {fmt.Println("test01:", h.name) //不知火舞
}// 指针类型函数
func test02(h *Hero) {fmt.Println("test02:", h.name) //不知火舞
}// 普通方法
func (h Hero) test03() {h.name = "干将莫邪"                //值拷贝,不影响主函数Namefmt.Println("test03:", h.name) // 干将莫邪
}// 指针类型方法
func (h *Hero) test04() {h.name = "干将莫邪"                // 指针会直接修改原数据fmt.Println("test04:", h.name) // 干将莫邪
}func main() {h := Hero{"不知火舞"}test01(h)test02(&h)h.test03()fmt.Println("main调用test03后", h.name)(&h).test04()fmt.Println("main调用test04后", h.name) // 干将莫邪h.test04()// 等价 (&p).test04 , 从形式上是传入值类型,但是本质仍然是地址拷贝,面试的时候会留坑让误以为传递的是指针,联想到是指针类型的方法,fmt.Println("main调用test04后", h.name) // 干将莫邪
}

输出:

test01: 不知火舞
test02: 不知火舞
test03: 干将莫邪
main调用test03后 不知火舞test04: 干将莫邪
main调用test04后 干将莫邪
test04: 干将莫邪
main调用test04后 干将莫邪

练习方法:

键盘录入数据,判断是奇数还是偶数

type TestMethod struct{}func (t *TestMethod) JudgeNumber() {var num intfmt.Println("请输入一个整数:")fmt.Scan(&num)if num%2 == 0 {fmt.Println(num, "是偶数")} else {fmt.Println(num, "是奇数")}
}func main() {t := TestMethod{}t.JudgeNumber()
}

编写一个计算机方法实现加减乘除

type Calculator struct {Num1 float64Num2 float64
}func (c *Calculator) result() float64 {fmt.Println()fmt.Println("——————————开始计算——————————:")fmt.Println("请输入第1个数字:")c.Num1 = 0fmt.Scan(&c.Num1)fmt.Println()c.Num2 = 0fmt.Println("请输入第2个数字:")fmt.Scan(&c.Num2)fmt.Println()var operator bytefmt.Println("请按数字选择运算符:")fmt.Println("1.加   2.减   3.乘   4.除")fmt.Scan(&operator)fmt.Println()var res float64switch operator {case 1:res = c.Num1 + c.Num2case 2:res = c.Num1 - c.Num2case 3:res = c.Num1 * c.Num2case 4:res = c.Num1 / c.Num2default:fmt.Println("运算符输入有误")}return res
}func main() {c := Calculator{}result := c.result()fmt.Println("结果为:", result)
}

输出:

——————————开始计算——————————:
请输入第1个数字:
10请输入第2个数字:
20请按数字选择运算符:
1.2.3.4.1结果为: 30

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go_命令行参数Args、flag

Args&#xff1a; os.Args是一个string的切片&#xff0c;可以存储所有的命令行参数&#xff08;在终端运行才行&#xff09;&#xff0c; func main() {args : os.Argsfor i, v : range args {fmt.Println("索引&#xff1a;", i, "\t数据&#xff1a;"…

防止sql注入的方法

防止sql注入从前端的页面到后台可以分为以下几个办法&#xff1a; 1.在前端页面就可以用js过滤数据 要引入的包&#xff1a; import Java.util.regex.*; 正则表达式&#xff1a; private String CHECKSQL “^(.)\\sand\\s(.)|(.)\\sor(.)\\s$”; 判断是否匹配&#xff1a; Pat…

使用haystack实现django全文检索搜索引擎功能

前言 django是python语言的一个web框架&#xff0c;功能强大。配合一些插件可为web网站很方便地添加搜索功能。 搜索引擎使用whoosh&#xff0c;是一个纯python实现的全文搜索引擎&#xff0c;小巧简单。 中文搜索需要进行中文分词&#xff0c;使用jieba。 直接在django项目中使…

Go_输入与输出

输出的几种方式&#xff1a; fmt.Print&#xff1a;属于标准输出流&#xff0c;一般使用它来进行屏幕输出&#xff0c;但它不能换行fmt.Printf&#xff1a;可以格式化输出&#xff0c;输出不换行fmt.Println&#xff1a;输出后换行fmt.Sprint&#xff1a;返回一个格式化的字符…

3、事件响应函数(一)

一、激活销毁 void OnEnable()//每次激活脚本时调用{print("OnEnable");}void OnDisable()//脚本取消激活状态调用{print("OnDisable");}void OnDestroy()//被销毁时调用{print("OnDestroy");} 二、鼠标事件 /// <summary>/// 代码添加到需…

人人都是产品经理?

产品经理顾名思义就是产品经理。那么只要搞懂产品是什么、经理又什么什么&#xff0c;就明白了产品经理是什么。 产品是什么&#xff1a; 产品是满足需求的载体&#xff0c;能被市场、人们使用和消费&#xff0c;并能满足人们某种需求&#xff08;创造价值&#xff09;的任何东…

搭建一个简单的FTP服务器

本文介绍通过win7自带的IIS来搭建一个只能实现基本功能的FTP服务器&#xff0c;第一次装好WIN7后我愣是没整出来&#xff0c;后来查了一下网上资料经过试验后搭建成功&#xff0c;其实原理和步骤与windows前期的版本差不多&#xff0c;主要是对新的操作系统还不是很熟悉。相信用…

3D文档(BRD、MRD、PRD)怎么写

3D文档&#xff1a; 一般来说&#xff0c;BRD作为战略方向的制定&#xff0c;是最早产出的文档&#xff0c;而MRD则是在战略方向的基础上对市场进行的分析&#xff0c;同时对后续工作的方向进行一些说明和指导&#xff0c;也可以说是通过对市场环境、竞品的分析&#xff0c;明确…

需求收集、分析、管理的方法

需求&#xff1a; 什么是需求 百度百科给的解释&#xff1a;指人们在某一特定的时期内在各种可能的价格下愿意并且能够购买某个具体商品的需要。所以要想明白需求&#xff0c;还要明白另外两个概念&#xff0c;需要和欲望&#xff0c;因为从需要到需求是一个由宏观到微观的过程…

Oracle中start with...connect by子句的用法

connect by 是结构化查询中用到的&#xff0c;其基本语法是&#xff1a;select … from tablenamestart with 条件1connect by 条件2where 条件3;例&#xff1a;select * from tablestart with org_id ‘HBHqfWGWPy’connect by prior org_id parent_id;简单说来是将一个树状…

用户访谈与问卷调查怎么做

用户访谈&#xff1a; 用提问交流的方式&#xff0c;了解用户体验的过程&#xff0c;访谈内容需要根据访谈目的来确定&#xff0c;通常包括产品的使用过程、使用感受、品牌印象等&#xff0c;属于定性研究。 访谈场景&#xff1a; 接听客服电话&#xff08;轮岗&#xff0c;客服…

【hdu2825】ac自动机 + 状压dp

传送门 题目大意&#xff1a; 给你一些密码片段字符串&#xff0c;让你求长度为n&#xff0c;且至少包含k个不同密码片段串的字符串的数量。 题解&#xff1a; 因为密码串不多&#xff0c;可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到j节点且状态为sta的数量。 其…

if函数 字体自动标红_发喜糖!REPT函数和图表订婚了~~

小伙伴们早上好呀&#xff01;今天为大家分享的是REPT函数的应用实例。案例1&#xff1a;基础用法左右&#xff1a;按照给定的次数重复显示文本用法&#xff1a;REPT(文本&#xff0c;重复次数)搭配&#xff1a;Wingdings字体家族的应用案例2&#xff1a;条形图⑴ 单元格D3输入…

用户体验五要素

用户体验&#xff1a; 用户在使用产品过程中建立起来的一种纯主观感受。 用户体验的重要性&#xff1a; 会失去客户&#xff1a;如果你没有良好的体验&#xff0c;用户不会使用你的产品&#xff0c;而且产品很难有二次机会接触用户。会增加获客成本&#xff1a;获客成本越来越高…

用鼠标旋转图像

这里涉及的到图像旋转后&#xff0c;方向的计算。我也不是很明白。先记录下来再说。 #_*_coding:utf-8 _*_import pygame from pygame.locals import * from sys import exit from gameobjects.vector2 import Vector2 from math import *background_image_filename./images/se…

trackingmore快递查询平台_国际快递物流信息追踪查询

以下是快递公司常用查询物流信息追踪平台1. 17TRACK查询网址&#xff1a;www.17track.net/zh-cn (强烈推荐&#xff0c;国际件都能查询)2. EMS查询网址&#xff1a;www.ems.com.cn 客服电话&#xff1a;11833. DHL网址查询&#xff1a;www.cn.dhl.com …

竞品分析该怎么做

竞品分析&#xff1a; 作用&#xff1a; 知己知彼&#xff0c;百战不殆。为自身产品设计提供功能、可用性、关键技术等方面的参考。提高自身产品的差异化程度。为新立项的产品、拍脑袋想出来的&#xff0c;降低风险。 如何选择竞品&#xff1a; 行业内领先的产品&#xff0c;通…

饿了么超时20分钟_饿了么回应“多等5分钟”,网友气炸了

广告记编辑整理(ID&#xff1a;adgroup)昨天一篇题为《外卖骑手&#xff0c;困在系统里》的文章刷屏文章指出外卖骑手是被平台系统算法与数据支配的“工具人”在系统的压迫下骑手们每天都在违反交规、与死神赛跑外卖员成了高危职业引发网友热议今天凌晨饿了么官方发布了一篇《你…

CCF历年试题总结

准备参加CCF考试&#xff0c;进行了一些试题的模拟&#xff0c;把做出的试题进行了一个汇总&#xff0c;持续更新中。 2017 201703-1 分蛋糕 转载于:https://www.cnblogs.com/shely-Wangfan/p/7452429.html

用户角色用户画像

用户角色&#xff1a; 用户角色 user personal&#xff0c;⽤户⻆⾊是⼀个集合体&#xff0c;不是指某个具体的⼈&#xff0c;是从用户群体中抽象出来的典型用户。 一般包含以下信息&#xff1a; 个人基本信息&#xff08;性别、年龄、性格、学历、婚姻、爱好、职业&#xff09…