golang [频道]频道的使用#channel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang [频道]频道的使用#channel相关的知识,希望对你有一定的参考价值。

//使用通道同步goroutine
func printNumbers(w chan bool) {
	for i := 0; i < 10; i++ {
		time.Sleep(1 * time.Microsecond)
		fmt.Printf("%d ", i)
	}
	w <- true
}

func printLetters(w chan bool) {
	for i := 'A'; i < 'A'+10; i++ {
		time.Sleep(1 * time.Microsecond)
		fmt.Printf("%c ", i)
	}
	w <- true
}

func main() {
	w1, w2 := make(chan bool), make(chan bool)
	go printNumbers(w1)
	go printLetters(w2)
	<-w1
	<-w2
}
//使用通道实现消息传递
func thrower(c chan int) {
	for i := 0; i < 5; i++ {
		c <- i
		fmt.Println("Threw  >>", i)
	}
}

func catcher(c chan int) {
	for i := 0; i < 5; i++ {
		num := <-c
		fmt.Println("Caught <<", num)
	}
}

func main() {
	c := make(chan int, 3)
	go thrower(c)
	go catcher(c)
	time.Sleep(100 * time.Millisecond)
}
//用关闭通道的方式避免死锁
func callerA(c chan string) {
	c <- "Hello World!"
	close(c)
}

func callerB(c chan string) {
	c <- "Hola Mundo!"
	close(c)
}

func main() {
	a, b := make(chan string), make(chan string)
	go callerA(a)
	go callerB(b)
	var msg string
	openA, openB := true, true
	for openA || openB {
		select {
		case msg, openA = <-a:
			if openA {
				fmt.Printf("%s from A\n", msg)
			}			
		case msg, openB = <-b:
			if openB {
				fmt.Printf("%s from B\n", msg)
			}			
		}
	}
}

client.get_channel(id) 在存在的频道上返回“none”

【中文标题】client.get_channel(id) 在存在的频道上返回“none”【英文标题】:client.get_channel(id) returning "none" on a channel that exists 【发布时间】:2021-05-17 17:05:17 【问题描述】:

我正在尝试为 Discord 制作一个机器人,每次我尝试使用以下代码向指定频道发送消息时,它不会给我任何错误,但会打印“无”,我当通道不存在时会期望。我现在已经尝试使用多个公会/服务器和多个文本通道,以及运行相同代码的多台计算机。在下面的代码中,我用作为 channelID 的 int 替换了 channelID,用我的令牌(字符串)替换了令牌。

import discord
from discord.ext import commands

intents = discord.Intents.all()
client = commands.Bot(command_prefix = 'bday ', intents = intents)
channel = client.get_channel(channelID)

print(channel)

client.run("token")

机器人确实具有管理员权限,以及两个意图网关

【问题讨论】:

您是否已将机器人邀请到具有给定频道 ID 的频道所在的服务器?如果没有,它不会像任何其他 get_ 函数一样工作。 @langley 是的,我有 【参考方案1】:

你需要修改

client.get_channel()

client.get_guild(your server's id).get_channel(channel id)

【讨论】:

现在它给了我错误 AttributeError: 'NoneType' object has no attribute 'get_channel',所以它在寻找公会时遇到了同样的问题【参考方案2】:

您似乎试图在实际运行您的机器人之前调用机器人的功能。

尝试在on_ready() 回调中添加您的代码,以确保您仅在初始化机器人本身后才尝试获取您的频道。

import discord
from discord.ext import commands

intents = discord.Intents.all()
client = commands.Bot(command_prefix = 'bday ', intents = intents)

@client.event
async def on_ready():
    channel = client.get_channel(channelID)
    print(channel)

client.run("token")

【讨论】:

非常感谢,终于成功了!我已经为此工作了几个小时,但无济于事。 :) 我已将您的答案标记为已接受

以上是关于golang [频道]频道的使用#channel的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中的 Go 频道

guild.text_channels 只返回 1 个频道而不是所有频道

如何关闭写作频道

django 频道 channels.exceptions.Channels Full

message.channel.members 不再包含文本频道中的所有用户

client.get_channel(id) 在存在的频道上返回“none”