Slide 12
Slide 12 text
© 2024 ANDPAD All Rights Reserved.
//go:linknameとは
package main
import
"fmt"
"time"
_ "unsafe"
)
//go:linkname MockNow time.Now
func MockNow() time.Time {
return time.Date(2024, 6, 1, 10, 0, 0, 0, time.Local)
}
func main() {
fmt.Printf("mockTime:%s", time.Now())
}
package main
import (
"fmt"
"time"
_ "unsafe"
)
//go:linkname MockNow time.Now
func MockNow() time.Time {
return time.Date(2024, 6, 1, 10, 0, 0, 0, time.Local)
}
func main() {
fmt.Printf("mockTime:%s", time.Now())
// mockTime:2024-06-01 10:00:00 +0900 JST
}
unsafeが必須
Goのcompiler directiveであるgo:linknameは
private(internal)な変数または関数のオブジェク
トシンボルを定義した別名のものと同じもののよ
うにエイリアス出来るようコンパイラに指示でき
ます。
型システムやモジュール性を破壊するため
unsafe packageを明示的にimportする必要が
あります。
この例ではパッケージ内でグローバルに標準ラ
イブラリのtime.Now関数を独自のMockNow関
数を上書きします。