Golang 变量定义的陷阱(注意事项)及解决方法

Golang 变量定义, Golang 变量初始化, Golang 指针

Golang 意事项

在使用 Golang 进行变量定义时,有时会遇到一些令人困惑的情况。本文将通过一个实例来说明其中的坑,并提供解决方案。

首先,我们来看一下文件结构:

.
├── a
│   └── a.go
├── b
│   └── b.go
├── go.mod
└── main.go

a.go 内容如下:

package a
var Hello = "a"
func NewHello() {
    Hello = "aa"
}

b.go 内容如下:

package b
import (
    "fmt"
    "one/a"
)
var World = a.Hello
func NewWorld() {
    fmt.Printf(World)
}

main.go 内容如下:

package main
import (
    "one/a"
    "one/b"
)
func main() {
    a.NewHello()
    b.NewWorld()
}

在上述代码中,我们主要关注 b.go 文件。根据我的理解,在 main 函数中实例化程序时,首先实例化 a 包,然后再实例化 b 包。因此,我们期望在 b 包中输出的结果应该是 "aa",但实际上输出的结果却仍然是 "a"。

这个问题的关键在于 Golang 是一种编译型语言。在变量初始化时,如果有赋值操作,编译器会直接将其视为已知值。此外,Golang 中的变量都是采用值传递方式,意味着对于重新定义的变量,在程序运行过程中所做的修改不会影响到它们。

因此,我们需要对 b.go 进行修改:

var World = &a.Hello
func NewWorld() {
    fmt.Printf(*World)
}

通过获取原变量的指针地址,并以指针的方式访问原变量的数据值,即可解决这个问题。

实际上,如果这两个变量的定义都放在同一个文件中,很可能就不会犯这种错误。然而,当我们将它们分别放在两个独立的程序文件中后,竟然没有意识到这一点。

通过本文的案例,我们看到了 Golang 变量定义时的一个陷阱,并提供了解决方法。希望这能帮助读者更好地理解和使用 Golang 中的变量定义。文章来源地址https://www.toymoban.com/diary/golang/613.html

到此这篇关于Golang 变量定义的陷阱(注意事项)及解决方法的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/golang/613.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
二极管实现或门以及与门的理解
上一篇 2023年12月25日 14:05
IO复用模型及其在网络编程中的应用
下一篇 2023年12月25日 14:15

相关文章

  • Golang 包使用注意事项

    1)在给一个文件打包时,该包对应一个文件夹,比如这里的utils文件夹对应的包名就是utils, 文件的包名通常和文件所在的文件夹名一致,一般为小写字母。 2)当一个文件要使用其它包函数或变量时,需要先引入对应的包 引入方式1:import \\\"包名\\\" 引入方式2: 3)package指令在

    2024年02月03日
    浏览(24)
  • Golang struct 结构体注意事项和使用细节

     一个int类型刚好8个字节。 可以看到结构体的字段在内存当中是连续分布的,通过地址的加减来找到对应的数据。 可以看到指针的地址也是连续的,r有两个*point类型,这个两个*Point类型的本身地址也是连续的,但是他们指向的地址不一定是连续。 结构体是用户单独定义的类

    2024年02月11日
    浏览(21)
  • Golang中map的使用详解及注意事项

    了解Golang中map的声明、自动增长、增加更新、删除等操作。掌握map的初始化、遍历、排序等技巧,以及结构体与OOP相关内容。深入了解Golang中map的使用方法和注意事项。

    2024年02月11日
    浏览(28)
  • Vue中data变量使用的注意事项

    因为在Vue中,data中的属性往往都是用于双向绑定,所以Vue会对其有劫持,所以我们在对data属性进行操作时,尽量不要对其直接操作,比如下面代码: 最终打印结果如下: 可以看到包含一个Observer属性,这是Vue自动加上的。 上面代码不断向 this.list 中添加数据,这样会造成过

    2024年02月13日
    浏览(19)
  • C语言中各变量声明及注意事项

    在C语言中,变量的声明语句用于告诉编译器该变量的类型、名称以及存储类型等信息。以下是C语言中常见的变量声明语句及其使用规则: 整型(int):用于声明整数类型的变量,例如: int num; 浮点型(float):用于声明单精度浮点数类型的变量,例如: float pi = 3.14; 字符型

    2024年01月19日
    浏览(30)
  • Go新项目-Golang使用RemoteAddr()获取远程主机地址的注意事项(9)

    http.Request 下的方法RemoteAddr() 可以获取客户端的地址和端口号,最近的一个项目中用到了这个方法。 使用过程中一直都没有什么问题,但是当项目上线之后就发现不管怎么获取ip,客户端地址都是127.0.0.1 。 对于这个问题一直百思不得其解,最后搞了半天才发现是nginx 的原因。

    2024年01月20日
    浏览(26)
  • Java中方法的定义及注意事项

    什么是方法: 方法(method)是程序中最小的执行单元 实际开发中,什么时候用到方法: 重复的代码、具有独立功能的代码可以抽取到方法中 实际开发中,方法有什么好处: 可以提高代码的复用性 可以提高代码的可维护性 当我们要计算不明确的数的时候,就可以用带参数的

    2023年04月22日
    浏览(22)
  • 结构体的使用和结构体指针的定义注意事项

    1、使用背景      由于想把不同地方的三个变量数据存放在一个结构体中,并且调用W25QXX_Write((u8*)p,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,写入SIZE长度的数据。调用flash写数据函数,其参数为指针地址,于是需要定义一个结构体和指向结构体的指针,这样调用flash写函数

    2024年01月20日
    浏览(24)
  • Google Earth Engine(GEE)——function中函数注意事项(内部变量不可在函数外调用)

    function函数是JavaScript的基本构件之一。JavaScript中的函数类似于过程--一组执行任务或计算数值的语句,但要使一个过程有资格成为一个函数,它应该接受一些输入并返回一个输出,在输入和输出之间有一些明显的关系。要使用一个函数,你必须在你想调用它的范围内定义它。

    2024年02月13日
    浏览(26)
  • Vue2:用ref方式绑定自定义事件的注意事项

    我们知道绑定自定义事件可以用 ref 方式实现。 但是,这个方式,需要注意下,否则,实现不了我们的效果。 需求是这样的,我们通过 ref 绑定的事件,来给 App 的 data 块中的变量赋值。 基本写法: 父组件 App 中 methods 函数: 给 Student 组件绑定自定义事件 test 此处的 this 是谁

    2024年01月19日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包