当前位置: 首页 > 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)
  • 今年一季度全国社会物流总额达91万亿元,工业品比重超八成
  • 宁波银行一季度净利74.17亿元增5.76%,不良率持平
  • 国家能源局:支持民营企业参股投资核电项目
  • 人社部:我国劳动力市场潜力足,韧性强
  • 释新闻|SEVIS是什么?在美留学生遭身份中止意味什么?
  • 印度媒体称印巴在克什米尔再次交火