- 按位置零运算符&^
左边为被操作数,右边数值为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)
}
_ 空白运算符
_
实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时候你并不需要使用函数的返回值。
同样该运算符也能使用于包引入没有三目运算符
自增运算符不能在赋值语句中使用 (
j = i++
)
指针
- 使用&创建指针
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
- 使用new 创建指针
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
- 列举出 Go 语言中的哪些值是不可寻址
https://time.geekbang.org/column/article/18042
- new 与 make 的区别