github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/src/test/chapter/ch6/41_unsafe_test.go (about)

     1  package unsafe_test
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  	"sync/atomic"
     7  	"testing"
     8  	"time"
     9  	"unsafe"
    10  )
    11  
    12  func TestUnsafe(t *testing.T) {
    13  	i := 10
    14  	f := *(*float64)(unsafe.Pointer(&i))
    15  	t.Log(unsafe.Pointer(&i))
    16  	t.Log(f)
    17  }
    18  
    19  // The cases is suitable for unsafe
    20  type MyInt int
    21  
    22  //合理的类型转换
    23  func TestConvert(t *testing.T) {
    24  	a := []int{1, 2, 3, 4}
    25  	b := *(*[]MyInt)(unsafe.Pointer(&a))
    26  	t.Log(b)
    27  }
    28  
    29  //原子类型操作
    30  func TestAtomic(t *testing.T) {
    31  	var shareBufPtr unsafe.Pointer
    32  	writeDataFn := func() {
    33  		data := []int{}
    34  		for i := 0; i < 100; i++ {
    35  			data = append(data, i)
    36  		}
    37  		atomic.StorePointer(&shareBufPtr, unsafe.Pointer(&data))
    38  	}
    39  	readDataFn := func() {
    40  		data := atomic.LoadPointer(&shareBufPtr)
    41  		fmt.Println(data, *(*[]int)(data))
    42  	}
    43  	var wg sync.WaitGroup
    44  	writeDataFn()
    45  	for i := 0; i < 10; i++ {
    46  		wg.Add(1)
    47  		go func() {
    48  			for i := 0; i < 10; i++ {
    49  				writeDataFn()
    50  				time.Sleep(time.Microsecond * 100)
    51  			}
    52  			wg.Done()
    53  		}()
    54  		wg.Add(1)
    55  		go func() {
    56  			for i := 0; i < 10; i++ {
    57  				readDataFn()
    58  				time.Sleep(time.Microsecond * 100)
    59  			}
    60  			wg.Done()
    61  		}()
    62  	}
    63  	wg.Wait()
    64  }