Go 函数

本贴最后更新于 1446 天前,其中的信息可能已经天翻地覆

如果把 比作一个程序,那么人的五官就是这个程序的属性,而人的行为就是这个程序的函数,函数表述的是一种行为。

函数

几乎所有的编程语言都会有函数类型,用以将零散的代码组织起来,封装成一个独立的函数,表述一个行为方式(处理过程)。

Java 中函数的表示法,通常在类中进行定义,称为方法,Java 中没有独立的函数,都需要定义在类中。

public class Person {
  public static void main(String[] args) {
    Person p = new Person();
    p.say("feiwo") // 调用方法
  }
  
  // 定义方法
  public void say(String msg) {
    System.out.println(msg)
  }
}

Java 中,函数的定义是没有关键字的,而有些语言中,则需要使用函数关键字来标识这是一个函数,譬如:在 Python 中有 def,在 PHPJavaScript 中有 function,在 Go 中则是使用 func 来进行定义。

Python

def say(msg):
  print(msg)

PHP

function say(msg) {
  echo msg;
}

JavaScript

function say(msg) {
  console.log(msg)
}

Go

func Say(msg string) {
	fmt.Println(msg)
}

上面列举的语言中,除了 Java,其他的语言都将函数作为一等公民,函数可以独立存在,直接被主函数调用。

Go 函数定义

Go 中,有两种函数类型,一种的是有名函数,一种是匿名函数,顾名思义,一种是有名字的,一种是没有名字,都使用 func 关键字来定义。

定义格式为:func (InputTypeList)OutPutTypeList

// 命名函数
func Say(msg string) {
	fmt.Println(msg)
}

func main() {
	// 函数调用
	Say("feiwo")

	// 匿名函数
	f := func(msg string) {
		fmt.Prinln(msg)
	}
	f("feiwo")
}

Go 中,函数可以作为类型参数或返回值参数传递,也可以使用 type 关键字定义新的类型

函数作为参数

// ResponseCallback 为函数类型
type ResponseCallback func(resp string)

// 将ResponseCallback函数类型作为参数传递
func Req(url string, callback ResponseCallback) {
	callback(url + "response...")
}

func main() {
	Req("https://www.feiwo.xyz", func(resp string) {
		fmt.Println(resp)
	})
}

函数作为返回值

// 定义一个结果返回的函数类型, 参数为convert函数参数
type FResult func(convert func(s interface{}) string) interface{}

// handle函数返回值为FResult的函数类型
func handle(origin interface{}) FResult {
	return func(convert func(s interface{}) string) interface{} {
		return convert(origin)
	}
}

func main() {
	// 调用函数,handle因为返回的是一个函数类型,写作为f()(),调用handle时立即执行FResult函数,因为FResult函数的参数是一个函数类型,
	// 这里使用了匿名函数方式实现,也可以定义一个命名函数传入
	result := handle("feiwo")(func(s interface{}) string {
		return "my name is " + s.(string)
	})
	fmt.Println(result)
}

函数签名

在平时的开发中,会编写大量的函数,那么系统系统是怎么识别是这个函数的呢?答案是通过函数签名来确定的。

Go 的函数签名 func (InputTypeList)OutPutTypeList
Go 中,有名函数和匿名函数,只要函数签名就可以相互赋值

// 定义一个结果返回的函数类型, 参数为convert函数参数
type FResult func(convert func(s interface{}) string) interface{}

// handle函数返回值为FResult的函数类型
func handle(origin interface{}) FResult {
	// 将匿名函数赋值给FResult,匿名函数与FResult函数类型的函数签名是一样的
	return func(convert func(s interface{}) string) interface{} {
		return convert(origin)
	}
}

函数方法

Go 中有一种函数的用法是很多语言所不具备的,那就是给函数类型添加方法和实现接口

// 定一个有名函数类型HandlerFunc
type HandlerFunc func(ResponseWriter, *Request)

// 为有名函数类型HandlerFunc添加方法
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

函数在程序中,是一种功能复用的技法,每个函数代表着一种功能的实现,在 Go 中,函数也是一种类型,和基础类型一样,可以作为参数和返回值。

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1388 回帖 • 279 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...