博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言笔记——指针,和C用法以及本质一样,但不支持指针的+-运算!
阅读量:5886 次
发布时间:2019-06-19

本文共 1741 字,大约阅读时间需要 5 分钟。

4.4.2 值类型和引用类型

所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值。

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

示例 4.22 

package mainimport "fmt"func main() { s := "good bye" var p *string = &s *p = "ciao" fmt.Printf("Here is the pointer p: %p\n", p) // prints address fmt.Printf("Here is the string *p: %s\n", *p) // prints string fmt.Printf("Here is the string s: %s\n", s) // prints same string }

输出:

Here is the pointer p: 0x2540820Here is the string *p: ciaoHere is the string s: ciao

通过对 *p 赋另一个值来更改“对象”,这样 s 也会随之更改。

内存示意图如下:

 

 

传递指针给函数不但可以节省内存(因为没有复制变量的值),而且赋予了函数直接修改外部变量的能力,所以被修改的变量不再需要使用 return 返回。如下的例子,reply 是一个指向 int 变量的指针,通过这个指针,我们在函数内修改了这个 int 变量的数值。

 

示例 6.6 

 

package mainimport (    "fmt")// this function changes reply: func Multiply(a, b int, reply *int) { *reply = a * b } func main() { n := 0 reply := &n Multiply(10, 5, reply) fmt.Println("Multiply:", *reply) // Multiply: 50 }

 

在 Go 语言中,指针(第 4.9 节)属于引用类型,其它的引用类型还包括 slices(第 7 章),maps(第 8 章)和 channel(第 13 章)。被引用的变量会存储在堆中,以便进行垃圾回收,且比栈拥有更大的内存空间。

 在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)

 

4.4.5 init 函数

变量除了可以在全局声明中初始化,也可以在 init 函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。

每一个源文件都可以包含一个或多个 init 函数。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。

一个可能的用途是在开始执行程序之前对数据进行检验或修复,以保证程序状态的正确性。

示例 4.6 :

package transimport "math"var Pi float64 func init() { Pi = 4 * math.Atan(1) // init() function computes Pi }

在它的 init 函数中计算变量 Pi 的初始值。

示例 4.7  中导入了包 trans(在相同的路径中)并且使用到了变量 Pi:

package mainimport (   "fmt"   "./trans" ) var twoPi = 2 * trans.Pi func main() { fmt.Printf("2*Pi = %g\n", twoPi) // 2*Pi = 6.283185307179586 }

init 函数也经常被用在当一个程序开始之前调用后台执行的 goroutine,如下面这个例子当中的 backend()

func init() {   // setup preparations   go backend() }

转载地址:http://sklix.baihongyu.com/

你可能感兴趣的文章
Qt 学习(1)
查看>>
MFC CEdit改变字体大小的方法
查看>>
java 中文数字排序方法
查看>>
centos 关于防火墙的命令
查看>>
openstack 源码分析
查看>>
ZOJ3861 Valid Pattern Lock(DFS||打表+枚举)
查看>>
pylint
查看>>
1025 选菜
查看>>
Debug 和 Release 编译方式的本质区别
查看>>
结构体
查看>>
Redis学习笔记~把redis放在DATA层,作为一种数据源,我认为更合理,也更符合我的面向对象原则...
查看>>
ztree使用实例
查看>>
idea 使用maven plugin tomcat 运行正常,无法进入debug模式
查看>>
jsfl 添加代码
查看>>
写在前面
查看>>
数据库设计时间字段
查看>>
PHP分页代码中的SQL语句可以换个写法
查看>>
加载样式js
查看>>
数据库之数据排序
查看>>
struts2将数据通过Json格式显示于EasyUI-datagrid数据表格
查看>>