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

本贴最后更新于 1688 天前,其中的信息可能已经沧海桑田

上一篇: Go 边看边练 -《Go 学习笔记》系列(二)


ToC


1.7 指针

支持指针类型 *T,指针的指针 **T,以及包含包名前缀的 *<package>.T

不能对指针做加减法等运算。

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 等和具体元素类型、长度等有关,属于未命名类型。

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

例如,

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 学习笔记》系列(四)



社区小贴士

  • 关注标签 [golang] 可以方便查看 Go 相关帖子
  • 关注作者后如有新帖将会收到通知
打赏 50 积分后可见
50 积分 • 3 打赏
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    417 引用 • 1336 回帖 • 678 关注
  • 教程
    118 引用 • 415 回帖 • 5 关注
  • 雨痕
    14 引用 • 67 回帖 • 3 关注

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • An

    好多人收藏

  • 88250

    @An 嗯,多谢 A 帮忙了。

    Go 是一门精简和理想化的语言,希望能持续下去,需要我们共同努力。

  • An

    @88250 我连 Python 都学不好,Go 是没啥希望了

    1 回复
  • xunxiake

    评论一个。 👍

  • ssmmgg431

    很好,谢谢

  • zonghua

    如果有人能够让我彻底弄懂指针,指针的指针和值。能够运用自如的话,我

    1 回复
  • Vanessa

    想起了大学学 C 的时候,最不懂的就是指针。。。

  • Vanessa

    学会了么?

    1 回复
  • An

    额,能撸点简单的项目

    1 回复
  • Vanessa

    看来我要加油了

请输入回帖内容 ...