【go语言基础】go中的方法

这篇具有很好参考价值的文章主要介绍了【go语言基础】go中的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先思考一个问题,什么是方法,什么是函数?

方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型,这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。

函数则没有这种从属关系。

func (t Type) methodName(parameter list) {
}
type Teacher struct {
	name     string
	salary   int
	currency string
}

// 在结构体类型上,创建一个方法并调用。
func (tea Teacher) testSalary() {
	fmt.Printf("Salary of %s is %d %s", tea.name, tea.salary, tea.currency)
}

func testUpFun() {
	tea:= Teacher{
		name:     "malou",
		salary:   10666,
		currency: "元",
	}
	tea.testSalary()
}
相同的名字的方法可以定义在不同的类型上,而相同名字的函数是不允许的
// Rectangle 定义Rectangle结构体
type Rectangle struct {
	length int
	width  int
}

// Circle 定义Circle 结构体
type Circle struct {
	radius float64
}

func (rectangle Rectangle) Area() int {
	return rectangle.width * rectangle.length
}

func (circle Circle) Area() float64 {
	return math.Pi * circle.radius * circle.radius
}

func testArea() {
	r := Rectangle{
		width:  10,
		length: 20,
	}
	fmt.Printf("Area is %d\n", r.Area())
	c := Circle{
		radius: 12,
	}
	fmt.Printf("Area is %f\n", c.Area())
}
值接收器和指针接收器之间的区别在于,在指针接收器的方法内部的改变对于调用者是可见的,然而值接收器的情况不是这样的。
// Dog struct
type Dog struct {
	name string
	age  int
}

// 使用值接收器的方法
func (d Dog) changeDogName(newName string) {
	d.name = newName
}

// 使用指针接收器的方法
func (d *Dog) changeAge(newAge int) {
	d.age = newAge
}

func testPointerStruct() {
	d := Dog{
		name: "金mao",
		age:  22,
	}
	// 并没有改变实际的值,只是改变的变量的副本
	fmt.Printf("before change is %s\n", d.name)
	d.changeDogName("马犬")
	fmt.Printf("after change is %s\n", d.name)

	// 改变的是变量本身的值
	fmt.Printf("before change is %d\n", d.age)
	d.changeAge(11)
	fmt.Printf("after change is %d\n", d.age)
}
那什么时候使用指针接收器,什么时候使用值接收器?

   指针接收器可以使用在:对方法内部的接收器所做的改变应该对调用者可见时。
   当拷贝一个结构体的代价过于昂贵的时候,比如说结构体中有很多字段,如果方法内使用
   这个结构体做为值接收器需要拷贝整个结构体,这个代价十分昂贵,这种情况下使用指针接收器,结构体不会被拷贝,只会传递一个指针到方法的内部。
   在其他的所有情况,值接收器都可以被使用。

在方法中使用值接收器 和 在函数中使用值参数:
type rectangle struct {
	width  int
	length int
}
// 函数中的参数,值类型,只能传递一个值类型
func area(r rectangle) {
	fmt.Printf("Area Function result :%d\n", r.length*r.width)
}

func (r rectangle) area() {
	fmt.Printf("Area Method result :%d\n", r.length*r.width)
}

func testFunAndMethod() {
	r := rectangle{
		width:  10,
		length: 15,
	}
	area(r)
	r.area()
	p := &r
	// (*p).area(),go解释器会自动的解引用
	p.area()
}

// 在方法中使用指针,和在函数中使用指针参数
func (r *rectangle) perimeter() {
	fmt.Printf("Area Method result is %d\n", r.width*r.length)
}

func perimeter(r *rectangle) {
	fmt.Printf("Area Function result is %d\n", r.width*r.length)
}

func testPointerStruct1() {
	r := rectangle{
		width:  12,
		length: 10,
	}
	p := &r
	perimeter(p)
	p.perimeter()

	// r.perimeter() 解释为 (&r).perimeter()  还有一种是(*p).name  相互解引用,从指针p->(*p),从值r到指针(&r)
	r.perimeter()
}

小结:

大多数方法都使用的是结构体从属,注意传递的是值传递还是指针传递。文章来源地址https://www.toymoban.com/news/detail-641721.html

到了这里,关于【go语言基础】go中的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go 基础篇】Go语言中的defer和recover:优雅处理错误

    Go语言以其简洁、高效和强大的特性受到了开发者的热烈欢迎。在错误处理方面,Go语言提供了一种优雅的机制,即通过 defer 和 recover 组合来处理恐慌(panic)错误。本文将详细介绍Go语言中的 defer 和 recover 机制,探讨其工作原理和在实际开发中的应用。 在软件开发过程中,

    2024年02月10日
    浏览(21)
  • 【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go语言入门指南:基础语法和常用特性解析 | 青训营 本文主要梳理自 第六届字节跳动青训营(后端组)-Go语言原理与实践第一节(王克纯老师主讲) 。同时

    2024年02月13日
    浏览(31)
  • 【Go 基础篇】深入探索:Go语言中的切片遍历与注意事项

    嗨,Go语言学习者!在我们的编程旅程中,切片(Slice)是一个极其重要的工具。它可以帮助我们处理各种类型的数据,从而让我们的代码更加灵活和高效。本文将围绕Go语言中切片的遍历方法以及在遍历时需要注意的事项进行探讨,帮助你更好地理解和应用切片。 切片的遍历

    2024年02月11日
    浏览(22)
  • 100天精通Golang(基础入门篇)——第15天:深入解析Go语言中函数的应用:从基础到进阶,助您精通函数编程!(进阶)

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月12日
    浏览(41)
  • 【Go 基础篇】Go语言中的defer关键字:延迟执行与资源管理

    在Go语言中, defer 是一种用于延迟执行函数调用的。它提供了一种简洁而强大的方式,用于在函数返回之前执行一些必要的清理操作或者释放资源。 defer 的灵活性和易用性使得它在Go语言中广泛应用于资源管理、错误处理和代码结构优化等方面。🚀🚀🚀 本篇博客将详

    2024年02月11日
    浏览(22)
  • GO富集绘图绘制方法,零基础教程,替换数据直接作图,完成版R语言脚本

    本期分享一个快速绘制GO富集结果图的方法,主要使用R语言tidyverse包,只需导入数据即可一步出图,可以自定义显示的数目、颜色、筛选参数, 从此以后绘制GO富集图只需1秒 。 下面是一个GO富集分析的结果数据表: ID:表示具体的GO条目 Description:GO条目的描述 RatioF:分子是

    2024年02月12日
    浏览(23)
  • 小白学Go基础01-Go 语言的介绍

    Go 语言对传统的面向对象开发进行了重新思考,并且提供了更高效的复用代码的手段。Go 语言还让用户能更高效地利用昂贵服务器上的所有核心,而且它编译大型项目的速度也很快。 Go 语言开发团队花了很长时间来解决当今软件开发人员面对的问题。开发人员在为项目选择语

    2024年02月10日
    浏览(20)
  • 【Go 基础篇】Go语言结构体基本使用

    在Go语言中,结构体是一种重要的数据类型,用于定义和组织一组不同类型的数据字段。结构体允许开发者创建自定义的复合数据类型,类似于其他编程语言中的类。本文将深入探讨Go语言中结构体的定义、初始化、嵌套、方法以及与其他语言的对比,以便全面了解如何在Go中

    2024年02月10日
    浏览(25)
  • Go语言基础(一)

    本文档参考golang官方文档以及一些教程书籍,若文档有错误,欢迎issue 🤗 https://go.dev/doc/tutorial/ 参考书籍《Go语言开发实战》 Go语言是Google公司发布的一种静态型、编译型的开源编程语言,是新时代的 C语言 。Go语言已经成为 云计算时代 的重要基础编程语言。 2012年3月28日,

    2024年02月06日
    浏览(22)
  • go语言基础---8

    go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序。 ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。

    2024年02月09日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包