此代码返回当前源文件的最新编译时间和日期:
package main
/*
#include<stdint.h>
#include<string.h>
void getCompileDateTime(uint8_t dt[12],uint8_t tm[9]){
strcpy(dt, __DATE__); //Mmm dd yyyy
strcpy(tm,__TIME__); //hh:mm:ss
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
dt := make([]byte, 12)
tm := make([]byte, 10)
C.getCompileDateTime((*C.uint8_t)(unsafe.Pointer(&dt[0])), (*C.uint8_t)(unsafe.Pointer(&tm[0])))
dts, tms := string(dt), string(tm)
fmt.Println(dts, tms)
}
是否有纯粹的Golang方式,或者这是唯一的方法?
答案 0 :(得分:2)
找到另一种在go linker上使用选项来分配字符串的方法:
-X importpath.name = value
将importpath命名名称中的字符串变量的值设置为value。 请注意,在Go 1.5之前,此选项采用了两个单独的参数。 现在它需要在第一个=符号上拆分一个参数。
代码示例:
package main
import "fmt"
var compileDate string
func main() {
fmt.Println(compileDate )
}
建设时:
go build -ldflags "-X main.compileDate=`date -u +.%Y%m%d.%H%M%S`" main.go
此方法的优点是,通过构建脚本可以使操作系统更加无关,而不会使用go:generate
答案 1 :(得分:0)
使用go:generate。作为构建过程的一部分,您必须在运行程序之前运行go generate
。您可以将其封装在共享函数中以跨文件使用。
package main
import (
"fmt"
"io/ioutil"
"strconv"
"time"
"strings"
)
//go:generate sh -c "date +'%s' > main_timestamp.go.txt"
func main() {
txt, err := ioutil.ReadFile("main_timestamp.go.txt")
if err == nil {
i, err := strconv.ParseInt(strings.TrimSpace(string(txt)), 10, 64)
if err == nil {
t := time.Unix(i, 0)
fmt.Printf("%s", t)
} else {
fmt.Printf("error parsing file %s", err)
}
} else {
fmt.Printf("error reading file %s", err)
}
}
答案 2 :(得分:0)
在开发期间,几乎不一样的不是编译时间,而是可执行文件的修改时间。当然,当复制可执行文件时,它可能会出错,但可能会帮助某人:
package main
import (
"fmt"
"os"
)
var (
linkTime string
)
func main() {
fi, _ := os.Stat(os.Args[0])
linkTime = fi.ModTime().String()
fmt.Println(linkTime)
}