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

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. 对于方法,接收者为值类型时,可以直接用指针类型的变量调用方法,发过来同样也可以。


http://www.kler.cn/a/590341.html

相关文章:

  • K8S快速部署
  • 新闻发布时间抽取分析
  • LinkedList和链表
  • 【MySQL】从零开始:掌握MySQL数据库的核心概念
  • containerd 拉取镜像的工具以及优劣
  • 系统架构设计师—案例分析—架构评估
  • LLM论文笔记 24: A Theory for Length Generalization in Learning to Reason
  • QT非UI设计器生成界面的国际化
  • Java 买百鸡问题
  • Google内购 Java服务端(Springboot)校验订单详细流程
  • 日志存储与分析
  • [贪心算法] 摆动序列
  • Matlab 汽车ABS实现模糊pid和pid控制
  • JVM垃圾回收器全面解析:从核心概念到选型指南
  • Matlab 经验模态分解和时频图绘制
  • 结构型模式之外观模式:让复杂系统变简单的利器
  • golang中的结构体
  • FlowGram 简介:开源前端流程搭建引擎
  • iPaaS集成平台轻量化架构的重要性
  • 国际数字影像产业园,超甲级地标招商进行中​