github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/01_base/unsafe/unsafe_test.go (about) 1 package unsafe 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 "unsafe" 8 ) 9 10 func TestSizeOf(t *testing.T) { 11 //Sizeof 函数可以返回一个类型所占用的内存大小,这个大小只有类型有关,. 12 // 和类型对应的变量存储的内容大小无关,比如bool型占用一个字节、int8也占用一个字节 13 t.Log(unsafe.Sizeof(true)) 14 t.Log(unsafe.Sizeof(int8(0))) 15 t.Log(unsafe.Sizeof(int16(10))) 16 t.Log(unsafe.Sizeof(int32(10000000))) 17 t.Log(unsafe.Sizeof(int64(10000000000000))) 18 t.Log(unsafe.Sizeof(int(10000000000000000))) 19 } 20 21 func TestAlignof(t *testing.T) { 22 //var b bool 23 //var i8 int8 24 //var i16 int16 25 //var i32 int32 26 //var i64 int64 27 // 28 //var f32 float32 29 // 30 //var s string 31 // 32 //var m map[string]string 33 // 34 //var p *int32 35 ////Alignof 返回一个类型的对齐值,也可以叫做对齐系数或者对齐倍数。 36 //// 对齐值是一个和内存对齐有关的值,合理的内存对齐可以提高内存读写的性能 37 //// unsafe.Alignof(x) 等价于 reflect.TypeOf(x).Align() 38 //fmt.Printf("%T %v\n", b, unsafe.Alignof(b)) 39 //fmt.Printf("%T %v\n", i8, unsafe.Alignof(i8)) 40 //fmt.Printf("%T %v\n", i16, unsafe.Alignof(i16)) 41 //fmt.Printf("%T %v\n", i32, unsafe.Alignof(i32)) 42 //fmt.Printf("%T %v\n", i64, unsafe.Alignof(i64)) 43 //fmt.Printf("%T %v\n", f32, unsafe.Alignof(f32)) 44 //fmt.Printf("%T %v\n", s, unsafe.Alignof(s)) 45 //fmt.Printf("%T %v\n", m, unsafe.Alignof(m)) 46 //fmt.Printf("%T %v\n", p, unsafe.Alignof(p)) 47 //fmt.Printf("%T %v\n", p, reflect.TypeOf(p).Align()) 48 //fmt.Printf("%T %v\n", p, unsafe.Alignof(p)) 49 50 ti, _ := time.ParseInLocation("2006-01-02 15:04:05", "2016-06-13 15:34:39", time.Local) 51 // 整点(向下取整) 52 fmt.Println(ti.Truncate(1 * time.Hour)) 53 // 整点(最接近) 54 fmt.Println(ti.Round(1 * time.Hour)) 55 56 // 整分(向下取整) 57 fmt.Println(ti.Truncate(1 * time.Minute)) 58 // 整分(最接近) 59 fmt.Println(ti.Round(1 * time.Minute)) 60 61 t2, _ := time.ParseInLocation("2006-01-02 15:04:05", ti.Format("2006-01-02 15:00:00"), time.Local) 62 fmt.Println(t2) 63 timer := time.NewTimer(5 * time.Second) 64 <-timer.C 65 ticker := time.NewTicker(5 * time.Second) 66 <-ticker.C 67 68 } 69 70 type user1 struct { 71 b byte 72 i int32 73 j int64 74 } 75 76 type user2 struct { 77 b byte 78 j int64 79 i int32 80 } 81 82 type user3 struct { 83 i int32 84 b byte 85 j int64 86 } 87 88 type user4 struct { 89 i int32 90 j int64 91 b byte 92 } 93 94 type user5 struct { 95 j int64 96 b byte 97 i int32 98 } 99 100 type user6 struct { 101 j int64 102 i int32 103 b byte 104 } 105 106 func TestOffsetof(t *testing.T) { 107 // Offsetof函数只适用于struct结构体中的字段相对于结构体的内存位置偏移量。结构体的第一个字段的偏移量都是0. 108 // unsafe.Offsetof(u1.i)等价于reflect.TypeOf(u1).Field(i).Offset 109 var u1 user2 110 111 fmt.Println(unsafe.Offsetof(u1.b)) 112 fmt.Println(unsafe.Offsetof(u1.i)) 113 fmt.Println(unsafe.Offsetof(u1.j)) 114 } 115 116 func TestSzieofStruct(t *testing.T) { 117 // 因为有对其方式,每个结构体的大小就不同 118 var u1 user1 119 var u2 user2 120 var u3 user3 121 var u4 user4 122 var u5 user5 123 var u6 user6 124 125 fmt.Println("u1 size is ", unsafe.Sizeof(u1)) 126 fmt.Println("u2 size is ", unsafe.Sizeof(u2)) 127 fmt.Println("u3 size is ", unsafe.Sizeof(u3)) 128 fmt.Println("u4 size is ", unsafe.Sizeof(u4)) 129 fmt.Println("u5 size is ", unsafe.Sizeof(u5)) 130 fmt.Println("u6 size is ", unsafe.Sizeof(u6)) 131 132 }