package main
/* #define _GNU_SOURCE 1 #include <stdio.h> #include <stdlib.h> #include <utmpx.h> #include <fcntl.h> #include <unistd.h> char *path_utmpx = _PATH_UTMPX; typedef struct utmpx utmpx; */ import "C" import ( "fmt" "io/ioutil" ) type Record C.utmpx func main() { path := C.GoString(C.path_utmpx) content, err := ioutil.ReadFile(path) handleError(err) var records []Record // now we have the bytes(content), the struct(Record/C.utmpx) // how can I cast bytes to struct ? } func handleError(err error) { if err != nil { panic("bad") } }
我想读content入Record 我已经问了几个相关问题。
content
Record
我已经阅读了一些文章和帖子,但仍然找不到解决方法。
我认为您正在以错误的方式进行操作。如果要使用C库,则可以使用C库读取文件。
不要纯粹使用cgo来拥有结构定义,您应该在Go中自己创建它们。然后,您可以编写适当的编组/解组代码以从原始字节读取。
快速的Google显示,有人已经完成了将相关C库的外观转换为Go所需的工作。请参阅utmp信息库。
一个简短的示例说明了如何使用它:
package main import ( "bytes" "fmt" "log" "github.com/ericlagergren/go-gnulib/utmp" ) func handleError(err error) { if err != nil { log.Fatal(err) } } func byteToStr(b []byte) string { i := bytes.IndexByte(b, 0) if i == -1 { i = len(b) } return string(b[:i]) } func main() { list, err := utmp.ReadUtmp(utmp.UtmpxFile, 0) handleError(err) for _, u := range list { fmt.Println(byteToStr(u.User[:])) } }
您可以查看软件包的GoDoc以utmp获得更多信息。
utmp