04 | 运算符与指针

2020-03-21  本文已影响0人  刀斧手何在

左边为被操作数,右边数值为1的比特位,对应相同位置的左边数字比特位会被置0

1 &^ 0 => 1
1 &^ 1 => 0

常用示例:

const (
    Readable = 1 << iota
    Writeable
    Executable
)

func TestBitClear(t *testing.T){
    a:= Readable | Writeable | Executable
    t.Log(a)
    a = a &^ Executable
    t.Log(a)
    a = a &^ Writeable
    t.Log(a)
}

指针

func TestPtr(t *testing.T){
     i := 1
     var iptr *int
     iptr = &i
     t.Log(iptr,*iptr)
     *iptr = 2
     t.Log(i)
}
//result : 0xc00008c160 1 2
func TestPtr(t *testing.T){
    iptr := new(int)
    *iptr = 2
    t.Log(reflect.TypeOf(iptr),iptr,*iptr,&iptr)
}
//result : *int 0xc000016230 2 0xc00000e028   

go语言的指针不允许进行计算

func TestUnsafe2(t *testing.T){
    i := 10
    f := *(*float64)(unsafe.Pointer(&i))
    t.Log(reflect.TypeOf(i),i,&i)
    t.Log(reflect.TypeOf(f),fmt.Sprintf("%f",f),&f)
}
//result : int 10 0xc0000dc008
// float64 0.000000 0xc0000dc010 

一般只用于别名类型的转化

type Dog struct {name string}
func TestPtr(t *testing.T){
    dog := Dog{"little pig"}
    dogP := &dog
    dogPtr := uintptr(unsafe.Pointer(dogP))
    t.Log(dog,dogP,dogPtr)
    *dogP = Dog{"big pig"}
    t.Log(dog,dogP,dogPtr)
}
//result: {little pig} &{little pig} 824634278736
// {big pig} &{big pig} 824634278736
上一篇 下一篇

猜你喜欢

热点阅读