06-指针(pointer)
1.01-包引用和引用顺序2.02-运算符号、标识符、注释、关键字3.03-变量和作用域4.02-常量(const)5.03-数组(array)6.04-切片(slice)7.05-map
8.06-指针(pointer)
9.07-通道(channel)10.08-结构体(struct)11.01-if语句12.02-for循环13.04-select语句14.03-switch语句15.make()、new()16.copy(切片间复制)17.append(增加切片成员)18.delete(删除map的成员)19.panic&recover20.03-匿名函数和闭包21.01-函数简单使用22.02-形参和实参23.04-递归函数24.05-方法25.06-接口(interface)26.01-并发27.02-携程通讯28.03-携程同步29.01-连接和建表30.02-创建数据31.03-基本查询32.04-高级查询33.05-初始化34.06-更新数据35.07-删除数据36.08 事务37.根据操作系统程序自动选择不同常量38.golang字串的base64编码解码39.golang数据类型转换40.golang 时间/时间戳的获取和转换说明:指针变量指向了一个值的内存地址
1. 声明指针
仅声明的指针是空指针
- 语法
var PointerName *type
- 语法示例
var intPointer *int var floatPoiner *float32 var stringPointer *string
- 完整示例
package main import "fmt" func main() { var stringPointer *string fmt.Println("指针值:",stringPointer) }
结果:
指针值: <nil>
注意:指针为空的时候,打印指针指向的值,程序会崩溃
2. 初始化指针
初始化之后,指针不在为空,其指向值为默认值(比如:string为空,int为0)
- 语法
pointerName := new(type)
- 语法示例
stringPointer := new(string)
- 完整示例
package main import ( "fmt" "reflect" ) func main() { stringPointer := new(string) fmt.Printf("stringPointer类型为:%s\n",reflect.TypeOf(stringPointer)) if stringPointer == nil{ fmt.Println("指针为空") }else { fmt.Println("指针值:",stringPointer) } }
结果
stringPointer类型为:*string 指针值: 0xc000040250
0xc000040250
为一个存储字串值的内存地址
3. 指针赋值
- 语法
PointerName := &VariableName
说明:
- 指针的值是一个内存地址,指针指向值是这个内存地址存储的数据。
- 指针指向的值为:
*PointerName
- 变量的内存地址为:
&VariableName
- 完整示例
package main import ( "fmt" "reflect" ) func main() { name := "刘备" //定义一个字串 namePointer := &name //指针指向该字串 fmt.Printf("nameProinter类型为:%s\n",reflect.TypeOf(namePointer)) fmt.Println("指针值:",namePointer) fmt.Println("指针指向值:",*namePointer) }
结果
nameProinter类型为:*string 指针值: 0xc000040250 指针指向值: 刘备
4. 空指针判断
上文声明指针的时候我们了解了什么是空指针,也知道了空指针打印指向值程序会崩溃。
程序中为避免这种情况,我们在使用指针指向值的时候,需要对空指针进行判断。
- 下边代码程序会崩溃
下边代码我们注释掉给指针赋值的两行,因为指针即没有赋值也没有初始化,因此指针为空。打印指针指向结果时,程序将崩溃。
package main import "fmt" func main() { //name := "刘备" var namePointer *string //namePointer = &name fmt.Println("namePointer 指向值为:",namePointer) }
- 指针判断
package main import "fmt" func main() { //name := "刘备" var namePointer *string //namePointer = &name if namePointer == nil{ fmt.Println("指针为空") }else { fmt.Println("指针指向值为:",*namePointer) } }
结果
指针为空
5. 指向指针的指针
package main import "fmt" func main() { name := "刘备" nameP := &name //指针 namePP := &nameP //指向指针的指针 fmt.Println("namePP:",namePP) fmt.Println("*namePP:",*namePP,"\tnameP:",nameP) fmt.Println("**namePP:",**namePP) //打印指向指针的指针的指向值的指向值 }
结果:
namePP: 0xc00000a028 *namePP: 0xc000040250 nameP: 0xc000040250 **namePP: 刘备
如上可见:
namePP
是指向指针的指针,*namePP
是“指向指针的指针”的指向值,即指针nameP
的值,也就是存储变量name
值的内存地址。- 继续推,可知
**namePP
即是变量name
的值
分类:
go语言开发 / go基础
posted on 2022-12-07 10:34 运维开发玄德公 阅读(152) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-12-07 【夜莺监控方案】05-监控postgre 集群(prometheuse+n9e+postgres_exporter)
2021-12-07 【prometheuse监控方案】监控postgre集群(prometheuse+grafna+postgres_exporter)