go语言的函数、方法、接口

本文介绍了Go语言中的函数、方法和接口。函数是Go的基本单元,包括参数列表和返回类型。方法则是为结构体定义的特殊函数,带有接收者参数。接口则是一种类型,包含一组方法签名,需全部实现后才能正常使用。通过接口,实现了多态性。文中通过实例展示了如何定义和使用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数

Go 语言函数定义格式如下:

func function_name( [parameter list] ) [return_types] {
   函数体
}

函数定义解析:

  • func:函数由 func 开始声明
  • function_name:函数名称,参数列表和返回值类型构成了函数签名。
  • parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
  • 函数体:函数定义的代码集合。
//例子
func PrintInt(a int) int {
  fmt.Println(a)
  return 0
}

二、方法

· Go中没有类,但是可以为结构体定义方法,方法就是一类带有特殊的接收者参数的函数。方法接收者在它自己的参数列表内,位于func关键字和 方法名之间

· 接收者可以是struct, interface,自定义的任意类型。但接收者声明必须在同一个包内,非内建类型。

  方法和函数长得差不多,区别是方法定义时func关键字后面紧跟的是括号,括号里面是调用者形参及调用者类型,之后才是func_name,再之后是括号,括号里面是入参形参及入参类型(没有入参的情况下括号不可以省略),最后是出参类型,如果有多个出参,则出参类型要用括号括住。

func (variable_name variable_data_type) func_name()(return_type){
    /*函数体*/
}

下面这个解释容易理解

方法和函数的最大区别是方法有接收者(从属),即方法都是有主人的。方法的使用方法如下:

//模板
func (主人名 类型)方法名(参数列表)(返回值列表){
  doSomething
}

例子

package main

import (
	"fmt"
)
//构造Animal结构体,即主人类型
type Animal struct{} 

//Animal类型的主人an,有一个Run方法,
//这里是值接收,也可以使用指针接收
func (an Animal)Run(a int) int {
    fmt.Println("Run ",a)
    return 0
}
func main() {
	var an Animal //声明主人
	an.Run(1)     //主人调用方法
}

三、接口

和int,string等一样,接口也是一种类型,和struct类似;区别是struct中存放各种属性,而接口中存放各种方法的声明。另外有几点需要注意:

1、接口内的方法数可以为0,即空接口;默认所有对象都实现了空接口;

2、同一个接口内所有的方法都被实现后,该接口才能被正常使用;例如下方的run和eat方法都需要被实现;

3、建议将相同的行为放在同一个接口内,例如下方的Eat接口,通过绑定到不同的对象上实现多态

package main

import (
	"fmt"
)
/*
type Eat interface{
    eat() int
}
*/

/*接口是一种类型,和struct类似,
包含n个方法,其中n>=0*/
type Action interface{ 
  //模板 方法名() 返回类型  
    run() int
    eat() int
}

type NullInterface interface{} //空接口

type Human struct{
    weight float32 //属性
    name   string
}

func (h Human) run() int{ //实现方法
	fmt.Println(h.name,"run run run")
	return 0
}

func (h Human) eat() int{ //实现方法
	fmt.Println(h.name,"eat eat eat")
	return 0
}

func main() {
	//使用方法
	/*空接口可以接受任意类型,故可以赋值
	string,struct等其他类型*/
	var n NullInterface = 1 
	fmt.Println("null interface", n)

	/*理解接口:接口类似工厂,我们希望生成一个
	工具箱(Human),它的相关参数是120.0和
	Bob;我们将生产需求下单给工厂Action,工
	厂Action生产了一个名字为act的工具箱,里
	面包含run和eat两种工具*/
	var act Action = Human{120, "Bob"}
	fmt.Println("hello", act)
	act.run()
	act.eat()
}

运行结果

null interface 1
hello {120 Bob}
Bob run run run
Bob eat eat eat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值