当我在Golang中分割类时,遇到了一些疑问
前提 tí)
Golangで超シンプルにローカルでwebアプリ起動するところまで の続き
筆者はほとんどJavaしかやってきていない
目标
handler()を別クラスにわけたい。mainがあるクラスに機能が集約するのが生理的に気持ち悪いため。
做过的事情 (zuò guò de shì
目录结构
golang_webapp_sample
└── src
└── main
├── golang_webapp_sample.go
└── handler
└── http_handler.go
原文要求使用中文进行改写,只需要一个选项:
源头
首先,将handler()方法放置在另一个类中。
同时,将此方法命名为Handler()并使用首字母大写,以便成为外部可访问的方法。
package handler
import (
"fmt"
"net/http"
)
func Handler(writer http.ResponseWriter, request *http.Request){
fmt.Fprintf(writer, "Hello World!")
}
下面是主类。
若想调用其他类的方法,可以按照以下的方式导入:”golang_webapp_sample/src/main/handler”。
package main
import (
"golang_webapp_sample/src/main/handler"
"net/http"
)
func main() {
http.HandleFunc("/", handler.Handler)
http.ListenAndServe(":8080", nil)
}
参考:Go语言的包(package)创建方法:将冗长的代码拆分到其他文件中的方式
确定

我赢了。
在这个阶段产生的问题
班级…?
不知怎么地,我分成不同的文件名来看,但再仔细想一想,才突然意识到我到现在为止根本没进行过类的定义。
参考资料:整理了关于Golang的方法内容。
以下是关于类的解释 – 虽然我想说明一下,但是在Golang中没有类的概念。因此,方法只能与类型相关联,没有其他更进一步的内容。
没错,Golang并没有类的概念。
仅通过方法的首字母大小写来确定可访问范围。
尽管在一个有main目的的类中将功能集中在一起会让人觉得不舒服,但这个想法从一开始就是错误的。
(尽管这样,根据角色将行为分割开来在设计上是可取的,耦合度低、内聚性高是没错的)
方法的参数…??(未解决→解决)
……?它为什么能动起来呢?
〜〜
http.HandleFunc("/", handler.Handler)
〜〜
〜〜
func Handler(writer http.ResponseWriter, request *http.Request){
〜〜
handler.Handlerがもうわからない。百歩譲ってhandler.Handler()ならわかる。そんなメソッドは定義していないが。
引数いらんの???何で????
メソッドと思って書いたHandler()は、メソッドのようでメソッドじゃない、少しメソッドな関数なのではという仮説。ここはGolangワールド、Javaのお作法とは違うのだ。
8/26 更新
感谢@K-juju さん的评论,我恍然大悟。谢谢!
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
这里是http.HandleFunc的定义。
根据看到的参数,可以知道第二个参数的类型是func(ResponseWriter, *Request)。就这个例子来说,
handler.Handler的类型是func(ResponseWriter, *Request)
handler.Handler()(参数省略)本身就没有返回值,所以没有什么类型。可能你误解的地方是,
http.HandleFunc(“/”, handler.Handler)
中的handler.Handler只是将函数作为参数传递,并没有调用该函数。
所以不需要参数。
只是将一个函数作为参数,不是在调用函数。
我之前一直以为在Java中使用的是方法,但其实在这个时候并没有调用函数。
谢谢!
下一个要做的事情
上記、メソッドについての疑問を解決する → 解決
Dockerのimageにして起動する → https://qiita.com/nitt_san/items/6cba1e422dcdd6098f06
Kubernetesに放り込んで色々試す