使用Golang实现简单的订阅功能可以利用pub-sub模式,也就是发布-订阅模式。在这种模式下,消息生产者将消息发布到中央主题,订阅者则可以从中央主题中订阅接收感兴趣的消息。这种模式中,消息生产者和订阅者之间是松耦合的,它们可以独立地进行演进。

以下是一个简单的订阅功能示例:

package main

import (
    "fmt"
    "sync"
)

type Topic struct {
    subscribers []chan string // 订阅者列表
    mutex       sync.Mutex   // 锁,防止订阅者列表被并发修改
}

func (t *Topic) Subscribe() chan string {
    t.mutex.Lock()
    defer t.mutex.Unlock()

    newSubscriber := make(chan string, 10) // 每个订阅者使用带缓冲的channel,避免在接收数据时阻塞
    t.subscribers = append(t.subscribers, newSubscriber)

    return newSubscriber
}

func (t *Topic) Publish(message string) {
    t.mutex.Lock()
    defer t.mutex.Unlock()

    for _, subscriber := range t.subscribers {
        select {
        case subscriber <- message: // 将消息发布给所有订阅者
        default: // 如果订阅者channel满了,丢弃消息
        }
    }
}

func main() {
    topic := &Topic{}

    alice := topic.Subscribe()
    bob := topic.Subscribe()

    go func() {
        for {
            message := <-alice // alice接收到消息
            fmt.Println("Alice receive:", message)
        }
    }()

    go func() {
        for {
            message := <-bob // bob接收到消息
            fmt.Println("Bob receive:", message)
        }
    }()

    topic.Publish("Hello world!") // 发布一条消息
}

在这个示例程序中,我们定义了一个名为Topic的类型,它表示中央主题,可以被多个订阅者订阅。Topic类型有两个方法:Subscribe和Publish。Subscribe方法返回一个带缓冲的channel,代表一个新的订阅者,Publish方法将消息发布给所有已订阅该主题的订阅者。

在这个示例程序中,我们创建了两个订阅者Alice和Bob,并启动了两个goroutine,分别接收消息并进行处理。接着,我们调用topic.Publish方法发布了一条消息,该消息被所有订阅者接收并处理。

由于每个订阅者对应一个带缓冲的channel,该实现可以支持多个订阅者,还可以避免由于订阅者阻塞导致的其它订阅者无法接收到消息的问题。当一个订阅者的channel已满时,Publish方法会丢弃该订阅者的消息,让其它订阅者可以继续接收消息。

以上就是使用Golang实现简单的订阅功能的详细说明和完整示例。