Golang函数以及函数和方法的区别

  • 在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中者完全是两个不同的东西。官方的解释是,方法是包含了接收者的函数。到底什么意思呢。

首先函数的格式是固定的,func+函数名+ 参数 + 返回值(可选) + 函数体。例如:

go 复制代码
func main() {
   fmt.Println("Hello go")
}

在golang中有两个特殊的函数,main函数和init函数,main函数不用介绍在所有语言中都一样,它作为一个程序的入口,只能有一个。init函数在每个package是可选的,可有可无,甚至可以有多个(但是强烈建议一个package中一个init函数),init函数在你导入该package时程序会自动调用init函数,所以init函数不用我们手动调用,l另外它只会被调用一次,因为当一个package被多次引用时,它只会被导入一次。

go 复制代码
package mypackage  
  
import ("fmt")  

//为了能让其他包(文件)能够访问该变量或方法,需要将该变量或方法大写
var I int  //全局变量,go函数外面定义的变量就是全局变量
  
func init() {  
    I = 0  
    fmt.Println("Call mypackage init1")  
}  
  
func init() {  
    I = 1  
    fmt.Println("Call mypackage init2")  
}  
go 复制代码
package main  
  
import (  
    "demo/mypackage"  
    "fmt"  
)  
  
func main() {  
    fmt.Println("Hello go.... I = ", mypackage.I)  
}  

下面来看下方法。

go 复制代码
package main  
  
import "fmt"  
  
type myint int  
  
//乘2  
func (p *myint) mydouble() int {  
    *p = *p * 2  
    return 0  
}  
  
//平方  
func (p myint) mysquare() int {  
    p = p * p  
    fmt.Println("mysquare p = ", p)  
    return 0  
}  
  
func main() {  
    var i myint = 2  
    i.mydouble()  
    fmt.Println("i = ", i)  
    i.mysquare()  
    fmt.Println("i = ", i)  
}

我们可以看到方法和函数的区别,方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至我们可以重定义基本数据类型。我们可以给他一些我们想要的方法来满足我们的实际工程中的需求,就像上面一样我重定义了int并给了它一个乘2和平方的方法,这里我们要注意一个细节,接收者是指针和非指针的区别,我们可以看到当接收者为指针式,我们可以通过方法改变该接收者的属性,但是非指针类型缺做不到。

这里的接收者和c++中的this指针有一些相似,我们可以把接受者当作一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能通过此方法改变类的成员变量。

相关推荐
余槐i1 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8262 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
死磕音视频3 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林3 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne4 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF4 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li5 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
顽疲5 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
upala5 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端