亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從共享庫運行服務器

從共享庫運行服務器

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 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號