为了账号安全,请及时绑定邮箱和手机立即绑定

从共享库运行服务器

从共享库运行服务器

Go
慕斯709654 2022-08-24 16:03:15
尝试从共享库运行 servr,所以我做了以下操作:将shahred图书馆写成:// server.gopackage mainimport (    "fmt"    "net/http")import "C"func hello(w http.ResponseWriter, req *http.Request) {    fmt.Fprintf(w, "hello\n")}func headers(w http.ResponseWriter, req *http.Request) {    for name, headers := range req.Header {        for _, h := range headers {            fmt.Fprintf(w, "%v: %v\n", name, h)        }    }}func main() {}// export Run serverfunc Run(port string) {    http.HandleFunc("/hello", hello)    http.HandleFunc("/headers", headers)    if err := http.ListenAndServe("localhost:"+port, nil); err == nil {        fmt.Println("listening to 8090")    } else {        fmt.Println("ListenAndServe: ", err)    }}将共享库编译为:$ go build -buildmode c-shared -o server.so server.go将调用共享库中的函数的主文件写入为:Run//main.gopackage main/*#cgo LDFLAGS: -ldl#include <dlfcn.h>void Run(char* port){}*/import "C"func main() {    // handle := C.dlopen(C.CString("server.so"), C.RTLD_LAZY)    // C.dlsym(handle, C.CString("8090"))    C.dlopen(C.CString("server.so"), C.RTLD_LAZY)    C.run(C.CString("8090"))}将主文件运行为:$ go run main.go主功能已直接终止,并且 srver 尚未在http://localhost:8090/hello
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

你为什么不把它分成一个go包(例如:包服务器)和导入这个包的主应用程序:


yourproject/cmd/server/main.go


package main


import (

    "yourproject/internal/server"

)


func main() {

    srv := server.New()

    // ...

    port := "8443"

    // do some logic here


    srv.Run(port)

}

和 yourproject/internal/server/server.go


package server


import (

    "fmt"

    "net/http"

)

import "C"


type Server struct{}


func New() *Server {

    return &Server{}

}


func hello(w http.ResponseWriter, req *http.Request) {

    fmt.Fprintf(w, "hello\n")

}


func headers(w http.ResponseWriter, req *http.Request) {

    for name, headers := range req.Header {

        for _, h := range headers {

            fmt.Fprintf(w, "%v: %v\n", name, h)

        }

    }

}


// export Run server

func (s *Server) Run(port string) {

    http.HandleFunc("/hello", hello)

    http.HandleFunc("/headers", headers)

    if err := http.ListenAndServe("localhost:"+port, nil); err == nil {

        fmt.Println("listening to 8090")

    } else {

        fmt.Println("ListenAndServe: ", err)

    }

}


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号