- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试阅读此内容:https://blog.golang.org/error-handling-and-go特别是标题为简化重复错误处理
的部分。
他们像这样调用http.Handle
:
func init() {
http.Handle("/view", appHandler(viewRecord))
}
http.Handle
的第二个参数需要一个 Handler
类型 ( https://golang.org/pkg/net/http/#Handler ),它需要有一个 serveHttp
方法。
此处的 serveHttp
函数:
func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err := fn(w, r); err != nil {
http.Error(w, err.Error(), 500)
}
}
所以,他们的类型 appHandler
现在实现了 Handler 接口(interface),因为它实现了 ServeHTTP
,我明白了。因此它可以在 Handle
函数中使用,而 viewRecord
则不能。
让我感到困惑的是 viewRecord
(类型为 appHandler
)和 ServeHTTP
之间的关系。哪个调用哪个?他们对“函数也可以是接收器”做了一个附加评论,我认为这就是我被绊倒的地方。
在这里,以 fn appHandler
作为接收器,我期望类似 viewRecord.serveHTTP()
的东西,但这没有意义,而 viewRecord
是一个函数。我认为正在发生的事情是 Handle
函数调用 serveHTTP
,但是 serveHTTP
是如何调用 viewRecord
的呢? p>
appHandler(viewRecord)
也进行强制转换吗?
基本上,我正在寻找关于函数作为接收者的含义的一些澄清。我是新手,我想我不小心落在了这里的一个不平凡的地雷上。
最佳答案
任何类型都可以是接收者。例如:
type X int
这里,X
是一个新类型,您可以为其创建方法:
func (x X) method() {
// Do something with x
}
在 Go 中,函数与任何其他类型一样。因此,如果您有一个函数类型:
type F func()
这里,F
是一个新类型,因此您可以为其定义方法:
func (x F) method() {
x()
}
通过上述声明,如果 value
的类型为 F
,现在您可以调用 value.method()
。
a:=F(func() {fmt.Println("hey")})
a.method()
这里,a
是F
类型的变量。 F
有一个名为 method
的方法,因此您可以调用 a.method
。当您调用它时,a.method
会调用 a
,它是一个函数。
回到您的示例,appHandler
似乎是一个函数类型:
type appHandler func(http.ResponseWriter, *http.Request)
因此任何具有该签名的函数都可以用来代替 appHandler
。假设您编写了这样一个函数:
func myHandler(http.ResponseWriter, *http.Request) {
// Handle request
}
只要请求 appHandler
,您就可以传递此函数。但是,如果不编写如下结构,则无法将 if 传递到需要 Handler
的位置:
type myHandlerStruct struct{}
func (myHandlerStruct) ServeHTTP(w http.ResponseWriter, r *http.Request) {
myHandler(w,r)
}
您可以为 appHandler
类型定义一个方法,而不是定义新的结构:
func (a appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
a(w,r)
}
现在,您可以将 appHandler
传递到需要 appHandler
的位置以及需要 Handler
的位置。如果将其作为 Handler
进行调用,则 ServeHTTP
方法将简单地将调用转发给底层函数。
关于戈兰;难以理解作为接收者的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102866/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!