Go 边看边练 -《Go 学习笔记》系列(三)

88250 · · 3004 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1.7 指针

支持指针类型 *T,指针的指针 **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 自定义类型

可将类型分为命名和未命名两大类。命名类型包括 boolintstring 等,而 arrayslicemap 等和具体元素类型、长度等有关,属于未命名类型。

具有相同声明的未命名类型被视为同一类型。

  • 具有相同基类型的指针。
  • 具有相同元素类型和长度的 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 边看边练 -《Go 学习笔记》系列(四)



有疑问加站长微信联系(非本文作者)

本文来自:黑客与画家的社区

感谢作者:88250

查看原文:Go 边看边练 -《Go 学习笔记》系列(三)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3004 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传