Tag:

go中无法读取utmpx文件

package main import ( “os” “fmt” ) func main() { fd, err := os.Open(“/var/run/utmpx”) fmt.Println(fd, err) var data []byte len, err := fd.Read(data) fmt.Println(len, err) } &{0xc42000a240}无 0零 没有错误,也没有数据。 从系统头文件中读取此路径/var/run/utmpx 。 如何获得这条道路是另一个问题 系统:macOS el capiton,go版本go1.8 darwin / amd64 **我的最终目标是将此文件读入go struct。**此文件包含系统用户信息。 我能这样做吗? 我会继续努力……

如何将字节缓冲区中以null结尾的字符串转换为Go中的字符串?

这个: label := string([]byte{97, 98, 99, 0, 0, 0, 0}) fmt.Printf(“%s\n”, label) 这样做( ^@是空字节): go run test.go abc^@^@^@

计算Go中切片中字符的出现次数

好的,所以我碰到了一堵砖墙。 编辑:在我的count()函数中使用bytes.IndexByte()使其运行速度几乎快两倍。 bytes.IndexByte()是用汇编而不是Go编写的。 仍然不是C速度,但更接近。 我有两个程序,一个在C中,一个在Go中,它们都计算文件中的换行符。 超级简单。 C程序运行~1.5秒,在2.4GB文件中运行~4.25秒。 我是否达到了Go的限速? 如果是这样, 究竟是什么造成了这种情况呢? 我可以阅读C,但我无法读取汇编,所以比较C的asm和Go的asm对我没什么用,除了表明Go还有400多行(忽略.ascii部分)。 虽然我知道Go无法匹配C步骤,但我不会假设4x减速。 想法? 这是Go的cpuprofile: 这是C(编译w / gcc -Wall -pedantic -O9 ) #include #include #include #include #include #include #include #include #define BUFFER_SIZE (16 * 1024) int main() { const char *file = “big.txt”; int fd = open (file, O_RDONLY); char buf[BUFFER_SIZE + 1]; uintmax_t bytes; size_t […]

Go TCP读取是非阻塞的

我想在Go中创建一个服务器和客户端,我已经设法与服务器和客户端进行通信。 但我遇到的问题是golang中的TCP读取是非阻塞的。 我想知道的是,golang中的读取是否可能像C中的读取一样阻塞。谢谢 编辑: 这是服务器的源代码: func Init_tcp() *net.TCPListener { laddr, err := net.ResolveTCPAddr(“tcp”, “:4243”) if err != nil { log.Fatal(err) } tcp, err := net.ListenTCP(“tcp”, laddr) if err != nil { log.Fatal(err) } return tcp } func main() { tcp := Init_tcp() conn, _ := tcp.Accept() data := make([]byte, 512) conn.SetNoDelay(false) for { conn.Read(data) fmt.Println(data) […]

包装结构(gcc)去

我有一些旧的C代码,有点大量使用打包结构。 我正在考虑使用Go作为此代码的包装器,但是很难找到传递或甚至为这些结构编写定义的方法。 例: import “unsafe”; type AlignTest struct { c byte; y int16; z int16; q int32; } func main() { vr := new(AlignTest); fmt.Println(unsafe.Sizeof(*vr), “\n”); } 使用打包/未对齐的结构返回12而不是1 + 2 + 2 + 4 = 9。 我知道我可以创建一个字节数组并手动进行解析,但这看起来非常脆弱且容易出错……

C回调和非Go线程

如何从不是由Go创建的线程调用C中的Go代码? 我分配给C函数指针,以便Go不创建的线程可以调用该指针并进入Go代码? Update0 我不想使用SWIG。 回调将来自线程Go以前没有见过。 cgo/life和pkg/runtime任何内容都不会显示此行为AFAICT。

寻找提供类似于Google Go频道的function的C或C ++库

…用于multithreading网络服务器。 我想在多个线程之间传递数据。 目前我正在使用套接字,select()上的主线程阻塞和recv()上的worker阻塞,尽管我觉得在C ++中可能有更高级或预先打包的方法来处理这个任务。

接口转到C库

如何将Go程序与C库连接起来? 我一直在浏览Go的源代码,但我仍然没有想到它。 如果某人已经这样做了,你能分享吗? 更新:感谢@fserb,我发布了Go资源中的一些文档: Cgo支持创建调用C代码的Go包。 用法:cgo [编译器选项] file.go 在调用gcc以编译包的C部分时,编译器选项通过uninterpreted传递。 输入file.go是一个语法上有效的Go源文件,它导入伪包“C”,然后引用诸如C.size_t之类的类型,诸如C.stdout之类的变量或诸如C.putchar之类的函数。 如果导入“C”后面紧跟注释,则在编译包的C部分时,该注释将用作标题。 例如: // #include // #include import “C” Cgo将输入文件转换为四个输出文件:两个Go源文件,一个用于6c(或8c或5c)的C文件,以及一个用于gcc的C文件。 Make.pkg中的标准包makefile规则自动执行使用cgo的过程。 有关示例,请参阅$ GOROOT / misc / cgo / stdio和$ GOROOT / misc / cgo / gmp。 Cgo尚未与gccgo合作。