热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang里的变量问题

我们在使用golang时,是否遇到过以下写法:packagemainimportfmtfuncfn()(string,error){returntest,fmt.Errorf(te


我们在使用 golang 时,是否遇到过以下写法:


package main
import "fmt"
func fn() (string, error) {
return "test", fmt.Errorf("test error")
}
func main() {
name := "main"
if name, err := fn(); err != nil {
fmt.Println("fn return name = ", name, err)
}
fmt.Println("name = ", name)
}

上面的输出,有时我们的期望输出为


fn return name = test, test error
name = test

但我们得到的输出结果为


fn return name = test, test error
name = main

这就是我们今天要说的主角 变量作用域


在golang中变量作用域分为:



  • 本地局部变量

  • 全局变量

  • 参数变量


本地局部变量


定义:在函数或者在语义块(if/for等)中定义的变量


生效范围:定义在函数里面则在整个函数范围有效; 定义在语义块,则在整个语义块生效


func main() {
name := "main" // main函数内的局部变量
if true {
name := "in if" // 条件语义块中定义的变量
}
for .... {
name := "in for" // for 语义块中定义的变量
}
{
name := "in block" // 普通语义块中定义的变量
}
}

从上面几种情况看,局部变量的定义范围就是看所在的 {} 的范围


全局变量


定义:函数外部定义的变量都属于全局变量;全局变量声明必须以 var 开头


生效范围:当前 package 内,如果想要其他 package 访问,全局变量以大写开头


package main
var name = "这里定义的为本包的全局变量"
var Name = "这里定义的为可以包外访问的全局变量"
func main() {
}

参数变量


定义:函数调用时传递的变量


生效范围:函数范围(但是有可能会可变传入参数的值,取决于传递的参数的类型)


如果传入的为基本数据类型 byte、bool、int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64、float32、float64、stringstruct、slice 时为值传递,生效范围就是本函数;但传入了 map、func、指针 等类型为地址传递,生效范围就不只传入的函数本身


再回头分析最上面的案例


// 这里name为if 语义块中定义的局部变量,所以不会改变 if 语义块外面的值
if name, err := fn(); err != nil {
fmt.Println("fn return name = ", name, err)
}

我们可以通过以下代码让其生效


package main
import "fmt"
func fn() (string, error) {
return "test", fmt.Errorf("test error")
}
func main() {
name := "main"
var err error

// 这里直接赋值,没有产生新的定义
if name, err = fn(); err != nil {
fmt.Println("fn return name = ", name, err)
}
fmt.Println("name = ", name)
}


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






推荐阅读
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • Go冒泡排序练习
    package main要求:随机生成5个元素的数组,并使用冒泡排序对其排序  从小到大思路分析:随机数用mathrand生成为了更好 ... [详细]
  • Go 快速入门指南命令行参数
    命令行参数个数调用os包即可。获取参数个数,遍历参数packagemainimport(fmtos)funcmain(){fmt.Printf(Numberofargsi ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 看到平台银行对接方案写的demo确实还不错记个笔记互相学习学习packageapiimport(cryptotlsnetnethttpstringssynct ... [详细]
  • 目录在Go语言项目中使用Zap日志库介绍默认的GoLogger日志库实现GoLogger设置Logger使用LoggerLogger的运行GoLogger的优势和劣势优势劣势Ube ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
author-avatar
Cindere丷lla_茹满
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有