這樣。不過只是個精確到納秒的計時器,不是精確到納秒的當前時間。windows好像只能拿到ms精度的當前時間吧,不是很清楚。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),柳城企業(yè)網(wǎng)站建設(shè),柳城品牌網(wǎng)站建設(shè),網(wǎng)站定制,柳城網(wǎng)站建設(shè)報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,柳城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
package main
import (
"syscall"
"time"
"unsafe"
)
func NewStopWatch() func() time.Duration {
var QPCTimer func() func() time.Duration
QPCTimer = func() func() time.Duration {
lib, _ := syscall.LoadLibrary("kernel32.dll")
qpc, _ := syscall.GetProcAddress(lib, "QueryPerformanceCounter")
qpf, _ := syscall.GetProcAddress(lib, "QueryPerformanceFrequency")
if qpc == 0 || qpf == 0 {
return nil
}
var freq, start uint64
syscall.Syscall(qpf, 1, uintptr(unsafe.Pointer(freq)), 0, 0)
syscall.Syscall(qpc, 1, uintptr(unsafe.Pointer(start)), 0, 0)
if freq = 0 {
return nil
}
freqns := float64(freq) / 1e9
return func() time.Duration {
var now uint64
syscall.Syscall(qpc, 1, uintptr(unsafe.Pointer(now)), 0, 0)
return time.Duration(float64(now-start) / freqns)
}
}
var StopWatch func() time.Duration
if StopWatch = QPCTimer(); StopWatch == nil {
// Fallback implementation
start := time.Now()
StopWatch = func() time.Duration { return time.Since(start) }
}
return StopWatch
}
func main() {
// Call a new stop watch to create one from this moment on.
watch := NewStopWatch()
// Do some stuff that takes time.
time.Sleep(1)
// Call the stop watch itself and it will return a time.Duration
dur := watch()
}
這和語言沒關(guān)系,操作系統(tǒng)要提供這樣的原語。linux和windows都是可以的。
利用 const 可以定義一個常量
const i=100
利用var 可以定義一個變量
var t int
當你將變量賦值以后,在程序不進行值的修改就可以當常量用
t=i
在一個包里,定義變量時使用小寫,格外定義個取值方法。則,在包外可以通過這個取值方法獲得值,直接無法使用。如果要實現(xiàn)只在函數(shù)內(nèi)部使用,則可以將變量定義在函數(shù)內(nèi)部。
func GetValue() int {
t:=i
return t
}
本文介紹一些Go語言的基礎(chǔ)語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問中的fmt包。
log包實現(xiàn)了簡單的日志服務,也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語言的運算符主要包括算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關(guān)運算符。
算術(shù)運算符:
關(guān)系運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關(guān)運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過標記退出循環(huán):
--THE END--
常量,就是在程序編譯階段就確定下來的值,而程序在運行時則無法改變該值。在Go程序中,常量可以是數(shù)值類型(包括整型、浮點型和復數(shù)類型)、布爾類型、字符串類型等。
定義一個常量使用const關(guān)鍵字,語法格式如下:
const:定義常量關(guān)鍵字
constantName:常量名稱
type:常量類型
value:常量的值
實例
運行結(jié)果
iota比較特殊,可以被認為是一個可被編譯器修改的常量,它默認開始值是0,每調(diào)用一次加1。遇到const關(guān)鍵字時被重置為0。
實例
運行結(jié)果
使用_跳過某些值
運行結(jié)果
運行結(jié)果
是 go 語言 自帶 的 測試 工具,
其中包含的是 兩類 ,
通過 go help test 可以看到 go test 的 使用 說明:
go test [-c] [-i] [build flags] [packages] [flags for test binary]
參數(shù)解讀:
-test.v : 是否輸出全部的單元測試用例(不管成功或者失?。?,默認沒有加上,所以只輸出失敗的單元測試用例。
-test.run pattern: 只跑哪些單元測試用例
-test.bench patten: 只跑那些性能測試用例
-test.benchmem : 是否在性能測試的時候輸出內(nèi)存情況
-test.benchtime t : 性能測試運行的時間,默認是1s
-test.cpuprofile cpu.out : 是否輸出cpu性能分析文件
-test.memprofile mem.out : 是否輸出內(nèi)存性能分析文件
-test.blockprofile block.out : 是否輸出內(nèi)部goroutine阻塞的性能分析文件
-test.memprofilerate n : 內(nèi)存性能分析的時候有一個分配了多少的時候才打點記錄的問題。這個參數(shù)就是設(shè)置打點的內(nèi)存分配間隔,也就是profile中一個sample代表的內(nèi)存大小。默認是設(shè)置為512 * 1024的。如果你將它設(shè)置為1,則每分配一個內(nèi)存塊就會在profile中有個打點,那么生成的profile的sample就會非常多。如果你設(shè)置為0,那就是不做打點了。
你可以通過設(shè)置memprofilerate=1和GOGC=off來關(guān)閉內(nèi)存回收,并且對每個內(nèi)存塊的分配進行觀察。
-test.blockprofilerate n: 基本同上,控制的是goroutine阻塞時候打點的納秒數(shù)。默認不設(shè)置就相當于-test.blockprofilerate=1,每一納秒都打點記錄一下
-test.parallel n : 性能測試的程序并行cpu數(shù),默認等于GOMAXPROCS。
-test.timeout t : 如果測試用例運行時間超過t,則拋出panic
-test.cpu 1,2,4 : 程序運行在哪些CPU上面,使用二進制的1所在位代表,和nginx的nginx_worker_cpu_affinity是一個道理
-test.short : 將那些運行時間較長的測試用例運行時間縮短