跳至正文
-
关注
IT极限技术分享汇

ITmax

IT极限技术分享汇

ITmax

  • 首页
  • 商店
  • 我的帐户
  • 结账
  • 购物车
  • 首页
  • 商店
  • 我的帐户
  • 结账
  • 购物车
关

搜索

Golang 中变量定义的坑

作者
2022年8月24日 1 分钟阅读
0

首先,文件结构如下:

.
├── 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作为编译型语言,var初始化的时候,如果有赋值,那么编译的时候会直接默认为已知值,另外golang的值都是值传递方式,而在程序运行中产生的修改不会对重新定义的变量进行修改。

所以b.go修改成

var World = &a.Hello

func NewWorld() {
    fmt.Printf(*World)
}

获取原变量的指针地址,然后以指针取原变量的数据值即可。

其实如果放在单文件来看,不会犯这种错误,但是把两个变量定义方式放在两个独立的程序文件后,竟然就没想到这一层。

https://segmentfault.com/a/1190000042369450

作者

关注我
其他文章
上一个

Google翻译的坑

下一个

Laravel 应用中快速的创建不同类型的代理

暂无评论!成为第一个。

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Copyright 2026 — IT极限技术分享汇. 备案号:浙ICP备17006560号-2