关于go:Golang-中变量定义的坑

32次阅读

共计 609 个字符,预计需要花费 2 分钟才能阅读完成。

首先,文件构造如下:

.
├── 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)
}

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

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

正文完
 0