版权声明:诸葛老刘所有 https://blog.csdn.net/weixin_39791387/article/details/87642826
本文适合初学者阅读
- 运算符
- 没有乘幂和绝对值运算符, 对应的是标准库math
里的Pow
,Abs
函数
- 自增,自减不再是运算符, 只能作为独立语句, 不能用于表达式.
- 表达式通常是求值代码, 可作为右值或参数使用.
- 表达式可以作为语句使用, 但语句不能当作表达式
- 语句完成一个行为的,比如 if else 代码块. - 指针
- 不能将内存地址与指针混为一谈.
- 内存地址是内存中每个字节单元的唯一编号,而指针则一个实体.指针会分配内存空间, 相当于一个专门用来保存地址的整型变量.
- 取址运算符 “&” , 用于获取对象地址.
- 指针运算符"", 用于间接引用目标对象.
- 二级指针 **T, 如包含包名则写成package.T
- 指针运算符为左值时,我们可更新目标对象状态;而为右值时则是为了获取目标状态
package main
func main() {
x := 10
var p *int = &x //获取地址, 保存到指针变量
*p += 10 // 用指针间接引用, 并更新对象
println(p, *p) // 输出指针所存储的地址, 以及目标对象
}
输出结果:
0xc000031f70 20
- 指针类型支持相等运算符, 但不能做加减法运算和类型转换.如果两个指针都指向同一个地址,或都为nil, 那么它们相等.
- 指针 没有专门指向成员的 "->" 运算符, 统一使用"."选择表达式.
func main() {
a := struct {
x int
} {} // 可以理解为python的类, 类里有个属性x
// todo: 后面又加了个{}, why?
a.x = 100 // 可以理解为类属性的实例化
p := &a // 相当于python中类的继承, p继承了a的属性
p.x += 10
println(p.x) // 输出110
}
- 零长度(zero-size)对象的地址是否相等和具体的实现版本有关, 不过肯定不等于nil
func main() {
var a, b struct{}
println(&a, &b)
println(&a == &b, a == b, &a == nil)
}
输出结果:(我的版本输出的结果就不一样,)
0xc000031f76 0xc000031f76
false true false