Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d39fbe8

Browse files
20220427
1 parent 0ed383a commit d39fbe8

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

‎README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ ps:白天上班,晚上更新,尽量日更,比心
8181

8282
[第36章 万能程序](https://github.com/java-aodeng/golang-examples/blob/master/go-36/flexible_reflect_test.go)
8383

84-
第37章 不安全编程
84+
[第37章 不安全编程](https://github.com/java-aodeng/golang-examples/blob/master/go-37/unsafe_test.go)
8585

8686
第38章 实现pipe-filter framework
8787

‎go-37/unsafe_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package go_37
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
"sync/atomic"
7+
"testing"
8+
"time"
9+
"unsafe"
10+
)
11+
12+
/*
13+
不安全编程
14+
15+
- go语言是不持支强制类型转换的
16+
*/
17+
18+
func TestUnsafe(t *testing.T) {
19+
i := 10
20+
f := *(*float64)(unsafe.Pointer(&i))
21+
t.Log(unsafe.Pointer(&i))
22+
t.Log(f)
23+
}
24+
25+
/* 运行结果,可以看到一个10强制类型转换后值变成了5e-323,所有go是不能这样写的,没java方便
26+
=== RUN TestUnsafe
27+
unsafe_test.go:17: 0xc00000a370
28+
unsafe_test.go:18: 5e-323
29+
--- PASS: TestUnsafe (0.00s)
30+
PASS
31+
*/
32+
33+
//原子类型操作
34+
func TestAtomic(t *testing.T) {
35+
var shareBufPtr unsafe.Pointer
36+
writeDataFn := func() {
37+
data := []int{}
38+
for i := 0; i < 100; i++ {
39+
data = append(data, i)
40+
}
41+
atomic.StorePointer(&shareBufPtr, unsafe.Pointer(&data))
42+
}
43+
readDataFn := func() {
44+
data := atomic.LoadPointer(&shareBufPtr)
45+
fmt.Println(data, *(*[]int)(data))
46+
}
47+
var wg sync.WaitGroup
48+
writeDataFn()
49+
for i := 0; i < 10; i++ {
50+
wg.Add(1)
51+
go func() {
52+
for i := 0; i < 10; i++ {
53+
writeDataFn()
54+
time.Sleep(time.Microsecond * 100)
55+
}
56+
wg.Done()
57+
}()
58+
wg.Add(1)
59+
go func() {
60+
for i := 0; i < 10; i++ {
61+
readDataFn()
62+
time.Sleep(time.Microsecond * 100)
63+
}
64+
wg.Done()
65+
}()
66+
}
67+
wg.Wait()
68+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /