Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Golang 中函数作为值与类型

Golang 中函数作为值与类型

作者头像
张乘辉
发布于 2019-06-14 04:28:54
发布于 2019-06-14 04:28:54
1.7K00
代码可运行
举报
文章被收录于专栏:后端进阶后端进阶
运行总次数:0
代码可运行

在 Go 语言中,我们可以把函数作为一种变量,用 type 去定义它,那么这个函数类型就可以作为值传递,甚至可以实现方法,这一特性是在太灵活了,有时候我们甚至可以利用这一特性进行类型转换。作为值传递的条件是类型具有相同的参数以及相同的返回值。

函数的类型转换

Go 语言的类型转换基本格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type_name(expression)

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type CalculateType func(int, int) // 声明了一个函数类型

// 该函数类型实现了一个方法
func (c *CalculateType) Serve() {
  fmt.Println("我是一个函数类型")
}

// 加法函数
func add(a, b int) {
  fmt.Println(a + b)
}

// 乘法函数
func mul(a, b int) {
  fmt.Println(a * b)
}

func main() {
  a := CalculateType(add) // 将add函数强制转换成CalculateType类型
  b := CalculateType(mul) // 将mul函数强制转换成CalculateType类型
  a(2, 3)
  b(2, 3)
  a.Serve()
  b.Serve()
}

// 5
// 6
// 我是一个函数类型
// 我是一个函数类型

如上,声明了一个 CalculateType 函数类型,并实现 Serve() 方法,并将拥有相同参数的 add 和 mul 强制转换成 CalculateType 函数类型,同时这两个函数都拥有了 CalculateType 函数类型的 Serve() 方法。

函数作参数传递

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type CalculateType func(a, b int) int // 声明了一个函数类型

// 加法函数
func add(a, b int) int {
  return a + b
}

// 乘法函数
func mul(a, b int) int {
  return a * b
}

func Calculate(a, b int, f CalculateType) int {
  return f(a, b)
}

func main() {
  a, b := 2, 3
  fmt.Println(Calculate(a, b, add))
  fmt.Println(Calculate(a, b, mul))
}
// 5
// 6

如上例子,Calculate 的 f 参数类型为 CalculateType,add 和 mul 函数具有和 CalculateType 函数类型相同的参数和返回值,因此可以将 add 和 mul 函数作为参数传入 Calculate 函数中。

net/http 包源码例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// HandleFunc registers the handler function for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
  DefaultServeMux.HandleFunc(pattern, handler)
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// HandleFunc registers the handler function for the given pattern.
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
  mux.Handle(pattern, HandlerFunc(handler))
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
  f(w, r)
}

刚开始看到这段源码的时候,真的有点懵逼了,这段源码的目的是为了将我们的 Handler 强制实现 ServeHTTP() 方法,如下例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func sayHi(w http.ResponseWriter, r *http.Request) {
  io.WriteString(w, "hi")
}

func main() {
  http.HandlerFunc("/", sayHi)
  http.ListenAndserve(":8080", nil)
}

因为 HandlerFunc 是一个函数类型,而 sayHi 函数拥有和 HandlerFunc 函数类型一样的参数值,因此可以将 sayHi 强制转换成 HandlerFunc,因此 sayHi 也拥有了 ServeHTTP() 方法,也就实现了 Handler 接口,同时,HandlerFunc 的 ServeHTTP 方法执行了它自己本身,也就是 sayHi 函数,这也就可以看出来了,sayHi 就是 Handler 被调用之后的执行结果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图文吃透Golang net/http 标准库--服务端
今天分享下Go语言net/http标准库的实现逻辑,文章将从客户端(Client)--服务端(Server)两个方向作为切入点,进而一步步分析http标准库内部是如何运作的。
小许code
2024/01/29
6190
图文吃透Golang net/http 标准库--服务端
golang构建http服务
除去细节,理解HTTP构建的网络应用只要关注两个端--客户端(client)和服务端(server),两个端的交互来自client的request,以及server端的response。所谓的http服务器,主要在于如何接受client的request,并向client返回response。
若与
2019/03/19
1.8K0
golang构建http服务
深入学习用Go编写HTTP服务器
Go是一门通用的编程语言,想要学习 Go 语言的 Web 开发,就必须知道如何用 Go 启动一个 HTTP 服务器用于接收和响应来自客户端的 HTTP 请求。用 Go实现一个http server非常容易,Go 语言标准库net/http自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此,我们不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。这篇文章会学习如何用net/http自己编写实现一个HTTP Serverk并探究其实现原理,以此来学习了解网络编程的常见范式以及设计思路。
KevinYan
2020/02/17
2.5K0
深入学习用Go编写HTTP服务器
golang(GO语言)http详解简单基础
因为好像长时间的写PHP可能大家感觉烦躁了,所以写一点golang的东西大家可以拿去玩玩,golang在web开发中让你得心应手,其实也是很好的东西,只要你玩进去之后感觉好爽,感觉比PHP的好处就是没有那么多的“限制”,基础部分大家可以看下简单的我再前边更新了一点点后边会继续给大家补上的,以后就是PHP+golang也可能会写一些object-c的,废话不多说开始写了,所有的代码我放在BUYVM上搭建的GOweb 大家可以去http://www.lingphp.com:8080/demo/查看获取完整代码,
李海彬
2018/03/22
1.5K0
go net/http标准库源码
可以看到 Go 实现的http服务步骤非常简单,首先注册路由,然后创建服务并开启监听即可。
leobhao
2024/04/01
1300
Go 每日一库之 net/http(基础和中间件)
几乎所有的编程语言都以Hello World作为入门程序的示例,其中有一部分以编写一个 Web 服务器作为实战案例的开始。每种编程语言都有很多用于编写 Web 服务器的库,或以标准库,或通过第三方库的方式提供。Go 语言也不例外。本文及后续的文章就去探索 Go 语言中的各个Web 编程框架,它们的基本使用,阅读它们的源码,比较它们优缺点。让我们先从 Go 语言的标准库net/http开始。标准库net/http让编写 Web 服务器的工作变得非常简单。我们一起探索如何使用net/http库实现一些常见的功能或模块,了解这些对我们学习其他的库或框架将会很有帮助。
用户7731323
2021/07/23
1.3K0
Go HTTP 编程 | 02 - net\u002Fhttp 包剖析
在上一篇文章中我们已经使用 net/http(以下简称 http) 创建了一个 Web 服务,并从源码层面分析了整个请求流转的过程,其中有两个比较核心的组件或者功能,一个是连接 Conn,另外一个是 ServeMux。
RiemannHypothesis
2022/11/25
4650
Go HTTP 编程 | 02 - net\u002Fhttp 包剖析
http服务源码分析
多读go的源码,可以加深对go语言的理解和认知,今天分享一下http相关的源码部分 在不使用第三方库的情况下,我们可以很容易的的用go实现一个http服务,
lpxxn
2019/05/25
6210
Golang:深入理解http服务开发原理
http 是典型的 C/S 架构,客户端向服务端发送请求(request),服务端做出应答(response)。
公号:咻咻ing
2019/10/22
1.7K0
Golang构建HTTP服务(一)--- net/http库源码笔记
实现一个最简单HTTP server需要多少代码?只需要一行,Python2的python -m SimpleHTTPServer,ruby的ruby -run -e httpd . -p 8888。对于Golang,实现一个最简单的http server也用不着几行,却能带来更具杀伤力的性能。 一个Go最简单的http服务器: package main import ( "fmt" "net/http" ) func IndexHandler(w http.ResponseWriter
李海彬
2018/03/19
1.9K0
Golang构建HTTP服务(一)--- net/http库源码笔记
来我们一起探究一下net/http 的代码流程
是GO的其中一个标准库,用于Web应用的开发,使用这个库,可以让开发变得更加迅速和简便,且易于上手。
阿兵云原生
2023/02/16
2010
[Introduction]万字手撕Go http源码server.go
从路由注册到监听本地端口后请求路由的一系列动作的分析,基本上仅限于net/http server.go这个包文件的路由相关部分解读
Wzy_CC
2020/08/28
1.3K0
golang-net/http源码分析之http server
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
月牙寂道长
2018/03/06
1.7K0
Go 源码学习之--net/http
其实自己不是很会看源码,但是学习优秀的源码是提升自己代码能力的一种方式,也可以对自己以后写代码有一个很好的影响,所以决定在之后的时间内,要有一个很好的习惯,阅读优秀的源码。刚开始自己会觉得看源码很痛苦,这个和我自己的方法有关系,刚开始自己总是想要知道源码的每一步操作,以及每个部分都是做什么,导致看着看着就看不下去了,所以也是从这次整理开始,调整自己阅读源码的方式,先去源码框架的主要流程,细枝末节后面等对整体框架有个了解,并且很清晰了,再回头来细致看,所以阅读过程中如果有不理解的地方自己先进行跳过,先对主体的
coders
2018/03/30
1.8K0
Go 源码学习之--net/http
Golang 语言怎么使用 net/http 标准库开发 http 应用?
在 Golang 语言中,可以使用 net/http 实现 http server,可以通过调用 ListenAndServe 函数,传入给定参数,地址和处理器 (handler)。处理器参数为 nil 时,默认使用 DefaultServeMux。
frank.
2021/06/22
1.2K0
Golang包——net
请求http://localhost:8080/hello会打印hello world
羊羽shine
2019/05/29
4680
深入理解Go标准库-ServeMux的使用与模式匹配
‍‍根据 Golang 文档 中的介绍,ServeMux是一个 HTTP 请求多路复用器(HTTP Request multiplexer)。它按照一定规则匹配请求URL和已注册的模式,并执行其中最匹配的模式的Handler
KevinYan
2023/12/13
5620
深入理解Go标准库-ServeMux的使用与模式匹配
Golang构建HTTP服务(二)--- Handler,ServeMux与中间件
Golang标准库http包提供了基础的http服务,这个服务又基于Handler接口和ServeMux结构的做Mutilpexer。实际上,go的作者设计Handler这样的接口,不仅提供了默认的ServeMux对象,开发者也可以自定义ServeMux对象。 本质上ServeMux只是一个路由管理器,而它本身也实现了Handler接口的ServeHTTP方法。因此围绕Handler接口的方法ServeHTTP,可以轻松的写出go中的中间件。 在go的http路由原理讨论中,追本溯源还是讨论Handler接
李海彬
2018/03/19
1.7K0
Golang构建HTTP服务(二)--- Handler,ServeMux与中间件
Go 语言 Web 编程系列(三)—— 基于官方标准库自定义路由处理器
我们在上篇教程介绍过这段代码的底层实现,这里 http.ListenAndServe 方法第二个参数传入的是 nil,表示底层会使用默认的 DefaultServeMux 实现将上述 HandleFunc 方法传入的处理函数转化为基于闭包方式定义的路由:
学院君
2019/12/20
9360
Go 语言 Web 编程系列(三)—— 基于官方标准库自定义路由处理器
Golang http请求源码分析
go提供的标准库net/http,实现一个简单的http server非常容易,只需要短短几行代码。本篇文章将会对go标准库net/http实现http服务的原理进行较为深入的探究
kinnylee
2020/10/15
1.1K1
Golang http请求源码分析
推荐阅读
相关推荐
图文吃透Golang net/http 标准库--服务端
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验