首页 > 其他分享 >go之方法

go之方法

时间:2022-09-19 13:55:04浏览次数:47  
标签:接收器 fmt dog Dog func go 方法

什么是方法

  方法其实就是一个函数,在func这个关键字和方法名中间加入一个特殊的接收器类型,接收器可以是结构体类型或者是非结构体类型,接收器是可以在方法的内部访问的 

方法的结构

func (接收器)   方法名(参数1 参数类型,参数2 参数类型)(返回值){
   内容
}

定义方法

package main

import (
	"fmt"
)

type Employee struct {
	name     string
	salary   int
	currency string
}

/*
  displaySalary() 方法将 Employee 做为接收器类型
*/
func (e Employee) displaySalary() {
	fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)  //Salary of Sam Adolf is $5000
}

func main() {
	emp1 := Employee {
		name:     "Sam Adolf",
		salary:   5000,
		currency: "$",
	}
	emp1.displaySalary() // 调用 Employee 类型的 displaySalary() 方法
}

  在上面程序的第 16 行,我们在 Employee 结构体类型上创建了一个 displaySalary 方法。displaySalary()方法在方法的内部访问了接收器 e Employee。在第 17 行,我们使用接收器 e,并打印 employee 的 name、currency 和 salary 这 3 个字段。

在第 26 行,我们调用了方法 emp1.displaySalary()

  程序输出:Salary of Sam Adolf is $5000

package main

import "fmt"

type Dog struct {
	Name string
	Age  int
}
func (self Dog)Speak()  {
	fmt.Println("我是狗狗:",self.Name,"我说话了")
}

func main() {
	var dog =Dog{"二哈",2}
	dog.Speak()
}

有了函数,为什么还要方法

  函数有几个值就要传几个,不能自动传值

  方法绑定给结构体,拿到结构体对象直接调用即可,不需要再传参数

值接收器

  修改不会影响原来的

package main

import "fmt"

type Dog struct {
	Name string
	Age  int
}
func (dog Dog)changeName(name string)  {
	dog.Name=name
	fmt.Println("方法中改了名字,",dog)  //方法中改了名字, {牧羊犬 2}
}

func main() {
	var dog =Dog{"二哈",2}
	dog.changeName("牧羊犬")
	fmt.Println(dog) // {二哈 2}
}

指针类型接收器

package main

import "fmt"

type Dog struct {
	Name string
	Age  int
}

func (dog *Dog) changeAge(age int) {
	dog.Age = age
	fmt.Println("方法中改了年龄,", dog) //方法中改了年龄, &{二哈 99}
}

func main() {
	var dog = Dog{"二哈", 2}
	dog.changeAge(99)
	fmt.Println(dog) //{二哈 99}
}

无论是值类型接收器还是指针类型接收器,都可以值来调用或者指针来调

  值来调用

package main

import "fmt"

type Dog struct {
	Name string
	Age  int
}

func (dog Dog) changeName(name string) {
	dog.Name = name
	fmt.Println("方法中改了名字,", dog) //方法中改了名字, {牧羊犬 2}
}

func (dog *Dog) changeAge(age int) {
	dog.Age = age
	fmt.Println("方法中改了年龄,", dog) //方法中改了年龄, &{二哈 99}
}

func main() {
	var dog = Dog{"二哈", 2}
	dog.changeName("牧羊犬")
	dog.changeAge(99)
	fmt.Println(dog) //{二哈 99}
}

  指针来调用

package main

import "fmt"

type Dog struct {
	Name string
	Age  int
}

func (dog Dog) changeName(name string) {
	dog.Name = name
	fmt.Println("方法中改了名字,", dog) //方法中改了名字, {牧羊犬 2}
}

func (dog *Dog) changeAge(age int) {
	dog.Age = age
	fmt.Println("方法中改了年龄,", dog) //方法中改了年龄, &{二哈 99}
}

func main() {
	var dog =&Dog{"二哈",2}
	dog.changeName("牧羊犬")
	dog.changeAge(99)
	fmt.Println(dog)  //&{二哈 99}
}

  总结:

  1.无论是值还是指针,都可以调用值接收器的方法或者指针接收器的方法

  2.无论值还是指针,只有指针接收器的方法,修改才会影响原来的

                                

标签:接收器,fmt,dog,Dog,func,go,方法
From: https://www.cnblogs.com/zhaoyuanshi/p/16707470.html

相关文章

  • Java 方法
    方法的命名规则1.方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。2.下划线可能出现在JUnit测试方法名称中用......
  • /dev/null文件的作用以及使用方法
    关于/dev/null,以及如何使用它今天在看MIT的一个课程时,老师给的程序实例中有一个地方没弄明白:#!/bin/bashecho"Startingprogramat$(date)"#Datewillbesubstitu......
  • div居中方法
    1.在父元素使用display:flex;justify-content:center;align-items:center其中justify-content是左右居中,align-items是上下居中......
  • GooglePlay 应用内评分测试
    为了提升用户体验,我们在应用内集成了Googleplay的应用内评分,体验如下:前期接入都挺简单,只是在测试这块遇到点麻烦。官方提供的测试文档文档中提供的使用内部测试轨道......
  • 无需编码即可在 Django 中构建服务(免费产品)
    无需编码即可在Django中构建服务(免费产品)你好!这篇文章解释了如何使用软UI仪表板,一个开源的启动器,用于构建服务姜戈无需编码。本视频资料中使用的源代码发布在Git......
  • 成为优秀程序员的 8 种简单方法
    成为优秀程序员的8种简单方法这篇文章适合任何想成为一名优秀程序员的人,适合那些看到别人变得更好或得到提升的人,适合那些正在开始学习之路的人,以及其他所有人。Photo......
  • js数组sort()方法按指定顺序排序
    一、sort介绍数组的sort()方法可以把数组排序,不传参数的默认按字典排序sort()方法还接受一个回调函数,按回调函数内代码逻辑排序该函数要比较两个值,然后返回一个用于说明这......
  • go之结构体
    什么是结构体结构体是用户定义的类型,表示若干个字段的集合,有时应该把数据整合一起,而不是让这些数据没有联系,这种情况下可以使用结构体语法//结构体//type关键字......
  • java中的System.currentTimeMillis()是什么?时间的单位转换以及方法的使用
    在开发过程中,通常很多人都习惯使用newDate()来获取当前时间。newDate()所做的事情其实就是调用了System.currentTimeMillis()。如果仅仅是需要或者毫秒数,那么完全可以使......
  • 关于IntelliJ IDEA 2020.1 勾选delegate IDE build/run actions to maven后测试类方法
    今天写MAVEN项目时,在执行测试类时发现方法都执行了两次,比如我执行insertAccout的测试类,就保存了两条相同的记录,执行别的测试类的时候,都会附带执行一次插入,产生一条记录,看了......