当前位置: 首页 > news >正文

golang函数与方法的区别

1.调用方式的区别

函数的调用方式:函数名(参数...)

方法的调用方式: 变量.方法名(参数...)

2.函数的使用

package main

import "fmt"
//函数参数为值类型,调用的时候只能传递值类型数据,不能传递指针类型
func Sum(a, b int) int {
	return a + b
}
//函数的参数为指针类型,调用的时候只能传递指针类型,不能传递值类型
func Sub(a, b *int) int {
	return *a - *b
}
func main() {
	a, b := 10, 2
	fmt.Println(Sum(a, b))
	fmt.Println(Sub(&a, &b))
}

3.方法的使用

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}
//接收者为值类型时,可以接受指针类型变量调用方法,反之亦然
func (p Person) setAge(age int) {
	p.Age = age
}
func (p *Person) setName(name string) {
	p.Name = name
}
func (p Person) PrintName() {
	fmt.Println(p.Name)
}
func main() {
	p1 := Person{
		Name: "张三",
		Age:  10,
	}
	p1.setName("王五")    //Name=王五
	(&p1).setName("赵六") //Name=赵六

	p1.setAge(12)
	(&p1).setAge(12) //Age= 10
	fmt.Println(p1)
	p1.PrintName()
}

 由代码可以看出:

  • 不管调用形式如何,真正决定是值拷贝还是地址拷贝,需要看方法和那个类型进行绑定。
  • 方法和值类型绑定,比如(p Person),则是值拷贝。不论是p1.SetAge(12)还(&p1).setAge(12)都不会改变Age的值。
  • 方法和指针类型绑定,比如(p *Person),则是地址拷贝。不论是值类型p1.setName("王五") 还是指针(&p1).setName("赵六")都可以改变Name的值。

4.总结

  1. 对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然。
  2. 对于方法,接收者为值类型时,可以直接用指针类型的变量调用方法,发过来同样也可以。

相关文章:

  • 【组件安装】Ubuntu 22.04.5 desktop 安装 Anyware Agent
  • springboot441-基于SpringBoot的校园自助交易系统(源码+数据库+纯前后端分离+部署讲解等)
  • c++ 类和对象 —— 中 【复习笔记】
  • UE5中 Character、PlayerController、PlayerState、GameMode和GameState核心类之间的联动和分工·
  • 【从零开始学习计算机科学】软件工程(一)软件工程中的过程模型
  • 分布式 IO 模块:助力实现智慧仓储
  • 2.2 B/S架构和Tomcat服务器
  • QT非UI设计器生成界面的国际化
  • 提高开发效率:公共字段自动化填充方案
  • 【优选算法篇】--深度解析之滑动窗口篇
  • appium之Toast元素识别
  • Matlab 雷达导引头伺服系统的建模与仿真研究
  • python-leetcode 55.子集
  • Flutter 按钮组件 ElevatedButton 详解
  • spring AOP学习
  • Matlab 汽车ABS实现模糊pid和pid控制
  • SQL语言的编译原理
  • SQLMesh宏操作符深度解析:掌握@star与@GENERATE_SURROGATE_KEY实战技巧
  • 重生之我在学Vue--第13天 Vue 3 单元测试实战指南
  • 【漫话机器学习系列】144.辛普森悖论(Simpson‘s Paradox)
  • 应对美政策调整:中国重在开放与创新,维护好数据主权
  • 起底新型保健品电话销售诈骗:从快递信息中筛选对象,忽悠其高价买药
  • 金沙记忆|元谋龙街渡:是起点也是终点
  • 特朗普要征电影关税惊扰全球电影业,“让好莱坞再次伟大”或现反效果
  • 媒体:南京秦淮区卫健委回应一医院涉嫌违规提供试管婴儿服务
  • 谢承祥已任自然资源部总工程师