我正在尝试使用 Soundpad 的 API,它通过命名管道公开。 在Python中,调用API就像
一样简单import win32file
handle = win32file.CreateFile(
r'\\.\pipe\sp_remote_control',
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
0,
None,
win32file.OPEN_EXISTING,
0,
None
)
win32file.WriteFile(handle, str.encode("DoPlaySound(2)"))
API 的细节对于这个问题并不重要。我想知道的是上面的 Python 代码和下面的 Go 代码之间的区别:
import (
"bufio"
"log"
"net/http"
"github.com/Microsoft/go-winio"
)
func main() {
conn, err := winio.DialPipe(`\\.\pipe\sp_remote_control`, nil)
if err != nil {
log.Fatal(err)
}
writer := bufio.NewWriter(conn)
_, err = writer.WriteString("DoPlaySound(2)")
}
与命名管道的连接已建立,14 个字节写入成功,但 Soundpad 由于某种原因似乎没有收到消息。 我已经研究过编码的差异,但 Go 将所有字符串编码为 UTF-8,与 Python 3 相同。 我也尝试过使用
writer.Write(([]byte)("DoPlaySound(2)"))
得到相同的结果。
对我来说,这两个例子看起来完全一样,所以我希望有人能指出其中的区别,也许可以帮助我找出 Go 版本不起作用的原因。
应该只是你最后一行的问题
_, err = writer.WriteString("DoPlaySound(2)")
成为
if _, err = writer.WriteString("DoPlaySound(2)"); err==nil {
err=writer.Flush()
}
需要写入管道的内容仍在 bufio.Writer 缓冲区中,需要刷新