Golang中如何运行主文件夹下的多个独立子文件夹

Golang中如何运行主文件夹下的多个独立子文件夹 我使用Golang创建了两个API服务提供者,并在main.go文件中运行这些API,但只有排在前面的函数能正常工作。后面的子函数无法工作。我应该怎么做才能让这两个函数都正常工作?

go.mod:

module gom

go 1.19

start/main.go:

package main

import (

"gom/blog"

"gom/email"

)

func main() {

    blog.Blog()

   email.SendMail()

}

blog/blog.go:

package blog


func Blog(){
   //code

}

email/email.go:

package email


func SendEmail(){
   //code

}

更多关于Golang中如何运行主文件夹下的多个独立子文件夹的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

“工作”是什么意思?

被调用函数的实现是什么?

更多关于Golang中如何运行主文件夹下的多个独立子文件夹的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我该如何同时运行两个函数?我需要这个功能。

您的函数很可能没有返回。在新的 Go 协程中异步运行它们。

go email.SendEmail()
// 最后一个函数不加 go,因为主协程结束后进程将退出。
blog.Blog()

再次,您所说的“只有第一个函数有效”具体是什么意思?

这些函数的实现会是什么样子?

假设两个函数都返回,我预计它们会被顺序调用。

在Golang中,当您运行多个独立的服务时,直接顺序调用会导致只有第一个函数能正常工作,因为第一个服务会阻塞主goroutine。您需要使用goroutine来并发运行这些服务。

以下是修改后的start/main.go

package main

import (
    "gom/blog"
    "gom/email"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    
    wg.Add(2)
    
    go func() {
        defer wg.Done()
        blog.Blog()
    }()
    
    go func() {
        defer wg.Done()
        email.SendMail()
    }()
    
    wg.Wait()
}

或者更简洁的版本:

package main

import (
    "gom/blog"
    "gom/email"
)

func main() {
    go blog.Blog()
    email.SendMail() // 如果SendMail是阻塞的,这个会一直运行
}

如果两个服务都是HTTP服务器,您需要这样修改:

package main

import (
    "log"
    "net/http"
    "sync"
)

func startBlogServer() {
    http.HandleFunc("/blog", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Blog API"))
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func startEmailServer() {
    http.HandleFunc("/email", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Email API"))
    })
    log.Fatal(http.ListenAndServe(":8081", nil))
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    
    go func() {
        defer wg.Done()
        startBlogServer()
    }()
    
    go func() {
        defer wg.Done()
        startEmailServer()
    }()
    
    wg.Wait()
}

对于您的具体代码结构,确保email/email.go中的函数名正确(您示例中写的是SendEmail但main.go调用的是SendMail):

// email/email.go
package email

func SendMail() {
    // 邮件服务代码
    // 如果是HTTP服务器,需要包含ListenAndServe
}

这样两个服务就能同时运行了。

回到顶部