package main
// //Needed for build
import "C"
import (
"fmt"
"io"
"net/http"
)
func homeHandler(w http.ResponseWriter, r *http.Request) {
header := fmt.Sprintf("%s %s %s\r\n", r.Method, r.RequestURI, r.Proto)
header += fmt.Sprintf("Host: %s\r\n", r.Host)
for k, vs := range r.Header {
header += fmt.Sprintf("%s: ", k)
for _, v := range vs {
header += v
}
header += "\r\n"
}
header += "\r\n"
fmt.Fprintf(w, "%s", header)
body, err := io.ReadAll(io.Reader(r.Body))
if err != nil {
http.Error(w, "Error reading request body", http.StatusInternalServerError)
return
}
w.Write(body)
}
//export main
func main() {
http.HandleFunc("/", homeHandler)
http.ListenAndServe(":8000", nil)
}
关于HTTP Server
通过在CreateIoCompletionPort函数上设置断点,测试出以下两种情况:
- HTTP Server程序会触发断点。
- Hello World程序不会触发断点。
基本可以判定golang net/http在Windows上使用了IOCP,性能应该是还不错。
关于编译成DLL
使用命令
go build -a -o dllmain.dll -buildmode=c-shared server.go
或
go build -a -ldflags "-s -w" -o dllmain.dll -buildmode=c-shared server.go
其中-s为压缩,-w为去掉调试信息,同时指定这两个选项很可能会被Windows Defender报毒。
关于导出函数
需要满足以下两个条件,缺一不可。
- 必须引入import “C”
- 在导出函数前添加注释//export 函数名,如本例中的//export main,这个格式要求比较严格,//和export之间不能有空格。
发表回复