1.7 指针
支持指针类型 *T
,指针的指针 **T
,以及包含包名前缀的 *
。
- 默认值
nil
,没有NULL
常量。 - 操作符 "&" 取变量地址,"*" 透过指针访问目标对象。
- 不支持指针运算,不支持 "->" 运算符,直接用 "." 访问目标成员。
不能对指针做加减法等运算。
x := 1234
p := &x
p++ // Error: invalid operation: p += 1 (mismatched types *int and int)
可以在 unsafe.Pointer
和任意类型指针间进行转换。
返回局部变量指针是安全的,编译器会根据需要将其分配在 GC Heap 上。
func test() *int {
x := 100
return &x // 在堆上分配 x 内存。但在内联时,也可能直接分配在目标栈。
}
将 Pointer
转换成 uintptr
,可变相实现指针运算。
注意:GC 把 uintptr
当成普通整数对象,它无法阻止 "关联" 对象被回收。
1.8 自定义类型
可将类型分为命名和未命名两大类。命名类型包括 bool
、int
、string
等,而 array
、slice
、map
等和具体元素类型、长度等有关,属于未命名类型。
具有相同声明的未命名类型被视为同一类型。
- 具有相同基类型的指针。
- 具有相同元素类型和长度的
array
。 - 具有相同元素类型的
slice
。 - 具有相同键值类型的
map
。 - 具有相同元素类型和传送方向的
channel
。 - 具有相同字段序列 (字段名、类型、标签、顺序) 的匿名
struct
。 - 签名相同 (参数和返回值,不包括参数名称) 的
function
。 - 方法集相同 (方法名、方法签名相同,和次序无关) 的
interface
。
例如,
var a struct { x int \`a\` }
var b struct { x int \`ab\` }
// cannot use a (type struct { x int "a" }) as type struct { x int "ab" } in assignment
b = a
可用 type
在全局或函数内定义新类型。
func main() {
type bigint int64
var x bigint = 100
println(x)
}
新类型不是原类型的别名,除拥有相同数据存储结构外,它们之间没有任何关系,不会持有原类型任何信息。除非目标类型是未命名类型,否则必须显式转换。
x := 1234
var b bigint = bigint(x) // 必须显式转换,除非是常量。
var b2 int64 = int64(b)
var s myslice = []int{1, 2, 3} // 未命名类型,隐式转换。
var s2 []int = s
- 本系列是基于雨痕的《Go 学习笔记》(第四版)整理汇编而成,非常感谢雨痕的辛勤付出与分享!
- 转载请注明:文章转载自:黑客与画家的社区 [http://symphony.b3log.org]
- 如果你觉得本章节做得不错,请在下面打赏一下吧~
有疑问加站长微信联系(非本文作者)