- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
因此,我试图在不忙等待的情况下从 stdin 读取,忽略 EOF,因为在我的案例中,客户端会来来去去。在 C 中,我会使用简单的 select() 或 poll(),但我正在尝试学习 Go,但我对缺少 select() 或 poll() 感到非常沮丧。我找不到在 Go 中使用 select 和 channels 的好方法,因为 Read() 将在 EOF 上立即返回,而我又回到了忙碌的等待状态。 syscall.Select() 似乎是最好的方法,但 Go 并没有费心去实现 FD_SET! 感叹
所以,我正在尝试使用 cgo。
package main
/*
#include <stdlib.h>
#include <sys/select.h>
void _FD_SET(int sysfd, void *set) {
FD_SET(sysfd, (fd_set*)set);
}
*/
import "C"
import (
"unsafe"
但是当我尝试在我的 Mac 上构建它时,我明白了。
# github.com/msoulier/mlogd
could not determine kind of name for C._FD_SET
clang errors for preamble:
src/github.com/msoulier/mlogd/mlogd.go:6:14: error: expected identifier or '('
void _FD_SET(int sysfd, void *set) {
^
src/github.com/msoulier/mlogd/mlogd.go:6:14: error: expected ')'
src/github.com/msoulier/mlogd/mlogd.go:6:13: note: to match this '('
void _FD_SET(int sysfd, void *set) {
^
2 errors generated.
如果我将导入合并在一起,那么大部分错误都会消失。
package main
/*
#include <stdlib.h>
#include <sys/select.h>
void _FD_SET(int sysfd, void *set) {
FD_SET(sysfd, (fd_set*)set);
}
*/
import (
"C"
"unsafe"
"syscall"
但是还有一个。
# github.com/msoulier/mlogd
could not determine kind of name for C._FD_SET
所以,我在这里寻找两件事。
我的环境。
msoulier@merlin:~/work/go$ go version
go version go1.6.2 darwin/amd64
msoulier@merlin:~/work/go$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/msoulier/work/go"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.6.2/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.6.2/libexec/pkg/tool/darwin_amd64"
GO15VENDOREXPERIMENT="1"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
CXX="clang++"
CGO_ENABLED="1"
提前致谢。必须比这更简单。
我通过 select 走到了这一步。
// loop forever - we expect to be killed with a SIGTERM or SIGINT
for {
logger.Debug("going into select on stdin")
var r_fdset syscall.FdSet
for i := 0; i < 16; i++ {
r_fdset.Bits[i] = 0
}
r_fdset.Bits[0] = 1
selerr := syscall.Select(1, &r_fdset, nil, nil, nil)
if selerr != nil {
logger.Warning(selerr)
}
但即使输入用完它也会立即返回。
迈克
最佳答案
在 Go 中,您执行阻塞操作。无处不在。
您将那些阻塞操作放在 goroutine 中,这些 goroutine 就像绿色线程/纤程一样。它们由 Go 运行时调度,可能在真实线程上,也可能共享线程。
然后您使用 channel 与您的 Go 程序的其他部分对话。
关于标准输入在 EOF 后始终可读的问题,请停止阅读。我的阅读器 goroutine 下面只是退出。
这里,有一个我刚刚写的例子:
package main
import (
"fmt"
"io"
"os"
"time"
)
func main() {
var err error
ch1 := make(chan []byte)
ch2 := make(chan int)
var buf []byte
var i int
var ok bool
go reader(ch1)
go counter(ch2)
for {
select {
case buf, ok = <-ch1:
if ok {
_, err = os.Stdout.Write([]byte("input: "))
_, err = os.Stdout.Write(buf)
}
case i, ok = <-ch2:
if ok {
_, err = fmt.Println("count", i)
}
}
if err != nil {
fmt.Println("error", err)
}
if !ok {
break
}
}
}
func counter(ch chan<- int) {
i := 0
for i < 5 {
i++
ch <- i
time.Sleep(time.Second)
}
close(ch)
}
func reader(ch chan<- []byte) {
var r int
var err error
for {
buf := make([]byte, 4000)
r, err = os.Stdin.Read(buf)
if r > 0 {
ch <- buf[:r]
}
if err != nil {
fmt.Println("read error", err)
if err == io.EOF {
break
}
// Or really just about any error on read is fatal
break
}
}
close(ch)
}
关于go - 用cgo编译出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38022991/
我试图使用 cgo 为 x264 库编写一个小包装器,但遇到了嵌套结构的问题。该库使用了许多复杂的结构,其中一些字段本身就是匿名结构。 当尝试使用 cgo 访问这些结构时,我遇到了编译错误,因为 go
我正在使用一个 C 库,与下面不同,我无法控制它。我需要将指向也包含指针的数组的指针传递给 C 函数。 package main /* #include typedef int* pInt; voi
根据 CGO 的文档( https://pkg.go.dev/cmd/cgo ),在实现中有一个已知的错误: Note: the current implementation has a bug. W
我正在尝试使用 CGO 将现有的 Go 包构建到 C 共享库和 header 中. 我用 -buildmode c-shared 构建了这个包如记录。 -buildmode=c-shared
C部分: struct Person {...} struct Person * get_team(int * n) 转到部分: n := C.int(0) var team *C.struct_Pe
我在ubuntu 18上使用go版本go版本“go1.14.4 linux / amd64”。该代码不是我编写的,但我认为它可以与比当前版本早几年的go版本一起使用。当我尝试构建时,出现此错误。有什么
我编写了一个 Go 程序来模拟按键操作。为此,我必须使用 cgo 和不同的 C 代码片段,具体取决于正在编译 Go 代码的操作系统。我编写的代码如下所示: package keyboard /* #i
我已经在 Linux 中围绕信号量函数编写了一个包装器。这在过去的 Go 1.3 和 Go 1.4 上对我有用,但我需要使用这个包装器重建我的应用程序,它不再使用 Go 1.6.2 或 Go 1.7r
关注我的 earlier question ,现在我在尝试执行此 article 中的所有相同步骤时遇到此错误,因为我已经从 Go 1.6.1 升级到 Go 1.7.1(我无法返回到 Go 1.6.1
有时,C API 可能需要 NULL 指针。 这在 CGO 中可能吗? 例如,我想在 Go 语言程序中向 strcmp() 传递一个 null 参数: package strutil /* #incl
我正在使用 native linux C 二进制文件,它有一个相当昂贵的初始化调用,我想在应用程序启动时执行一次。这个调用应该在内部打开一堆文件句柄供以后使用。当我从 Go 调用这个昂贵的初始化 C
我正在使用这个库 https://github.com/billziss-gh/cgofuse ,还有一些接口(interface)需要实现,其中一个看起来像这样: func (self *Memfs
似乎我不能使用 Cgo 调用在另一个目录而不是当前 Go 包中声明的 C 函数。 所有文件的代码: // TestGoCallOC.go package main /* #include "test.
去项目结构 src test.go testc/collection/linkedlist.h testc/collection/linkedlist.c test.go package
我正在用 Go 编写一个库,我正在使用 CGo 将其编译为 native 库,但是当导出函数时,它们在函数声明和文档注释之间有这个烦人的空行。 例如,假设我的 go 文件中有这个 /** * Pri
为什么使用 Cgo 时我的 .go 文件中无法识别 c 函数? 我遵循了所有过程并尝试了 godoc 上的示例,它有效但这个不起作用,是什么原因? 文件夹结构 libsha.a sha.cpp 扫码
我正在用 cgo 包装一个 C 库,以供普通 Go 代码使用。 我的问题是我想将错误字符串向上传播到 Go API,但是有问题的 C 库通过线程本地存储提供错误字符串;有一个全局 get_error(
我有点乱,我看不出我是怎么摆脱它的……我得到了什么:* 我使用 cgo 构建的库 (dll)。* 使用此库 (dll) 的 C++ 应用程序。 我要做什么:我尝试释放在 C++ 应用程序的 cgo 库
我正在用 Go 编写一个库,我想导出到一个 c-shared-library。它工作得很好,但是我发现导出的 header 使用 p0、p1、p2、 有点烦人…… 用于参数名称,而不是 Go 中的原始
我目前正在开发一个程序,该程序使用带有 cgo 的 c 库调用长时间运行的函数。我无法使用 c 编辑库以允许超时。到目前为止,我唯一的解决方案是让僵尸 goroutine 继续运行 func Time
我是一名优秀的程序员,十分优秀!