如何在Golang中获取当前源文件的最新编译时间和日期?

时间:2016-05-13 04:56:15

标签: go

此代码返回当前源文件的最新编译时间和日期:

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方式,或者这是唯一的方法?

3 个答案:

答案 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)
}

Playground