当我在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)创建方法:将冗长的代码拆分到其他文件中的方式

确定

screenshot2.png

我赢了。

在这个阶段产生的问题

班级…?

不知怎么地,我分成不同的文件名来看,但再仔细想一想,才突然意识到我到现在为止根本没进行过类的定义。
参考资料:整理了关于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に放り込んで色々試す

bannerAds