Почему программа дважды создает глобальную переменную пакета? - PullRequest
0 голосов
/ 25 октября 2019

Версия Go: 1.11

Это мой рабочий каталог. Я хочу использовать переменную пакета для хранения моего ресурса Dict.

resource
resource/data
resource/BUILD
resource/common.go
resource/test
resource/test/testtable_test.go
resource/test/BUILD
resource/test/testtable.go

common.go

// Package resource 保存所有的数据资源                                                                                                                 
package resource

import (
    "git.xxx.com/aes/tsubasa/resource/test"
)

// MustInitializeResource Server启动时将会初始化这里
func MustInitializeResource(conf *config.Config, resourceDir string) {
    fmt.Println(fmt.Sprintf("begin common======Dataset: %p, Testtable: %v %p", test.Dataset, test.Dataset.Testtable, &test.Dataset.Testtable))

    test.MustInitialTesttable(filepath.Join(resourceDir, conf.TestFile))
    fmt.Println(fmt.Sprintf("begin after======Dataset: %p, Testtable: %v %p", test.Dataset, test.Dataset.Testtable, &test.Dataset.Testtable))
}

testtable.go

// Package test 是资源单例测试目录
package test

// TestWordSet test
type TestWordSet struct {
    Testtable map[string]bool
}

var (
    Dataset    *TestWordSet
)

func init() {
    Dataset = &TestWordSet{
        Testtable: make(map[string]bool),
    }
}

// MustInitialTestTable 初始化Testtable
func MustInitialTesttable(filepath string) {
    testLogger.Error("begin======Dataset: %p, Testtable: %v %p", Dataset, Dataset.Testtable, &Dataset.Testtable)

    Dataset.Testtable[trimStr] = true
    testLogger.Error("Dataset: %p, Testtable: %v %p", Dataset, Dataset.Testtable, &Dataset.Testtable)
}

testtable_test.go

package test

import (
    "git.xxx.com/aes/tsubasa/resource"
)

func TestCheckIn(t *testing.T) {
    testLogger.Error("begin test======Dataset: %p, Testtable: %v %p", Dataset, Dataset.Testtable, &Dataset.Testtable)
    resource.MustInitializeResource(conf, resourceDir)
    testLogger.Error("after test======Dataset: %p, Testtable: %v %p", Dataset, Dataset.Testtable, &Dataset.Testtable)
}


Ошибка теста:

E1025 03:48:44.524766    1726 testtable_test.go:21] : begin test======Dataset: 0xc420104058, Testtable: map[] 0xc420104058
begin common======Dataset: 0xc420104038, Testtable: map[] 0xc420104038
E1025 03:48:44.524998    1726 testtable.go:32] resource.test: begin======Dataset: 0xc420104038, Testtable: map[] 0xc420104038
E1025 03:48:44.525048    1726 testtable.go:49] resource.test: Dataset: 0xc420104038, Testtable: map[hello:true world:true] 0xc420104038
begin after======Dataset: 0xc420104038, Testtable: map[hello:true world:true] 0xc420104038
E1025 03:48:44.525065    1726 testtable_test.go:23] : after test======Dataset: 0xc420104058, Testtable: map[] 0xc420104058
E1025 03:48:44.525075    1726 testtable.go:54] resource.test: Dataset: 0xc420104058, Testtable: map[] 0xc420104058
E1025 03:48:44.525123    1726 testtable.go:54] resource.test: Dataset: 0xc420104058, Testtable: map[] 0xc420104058
E1025 03:48:44.525163    1726 testtable.go:54] resource.test: Dataset: 0xc420104058, Testtable: map[] 0xc420104058
E1025 03:48:44.525173    1726 testtable.go:54] resource.test: Dataset: 0xc420104058, Testtable: map[] 0xc420104058

Согласно этим трем строкам, есть две переменные пакета Testtable с другим адресом после вызова resource.MustInitializeResource(conf, resourceDir).

E1025 03:48:44.524766    1726 testtable_test.go:21] : begin test======Dataset: 0xc420104058, Testtable: map[] 0xc420104058
begin common======Dataset: 0xc420104038, Testtable: map[] 0xc420104038
E1025 03:48:44.524998    1726 testtable.go:32] resource.test: begin======Dataset: 0xc420104038, Testtable: map[] 0xc420104038
E1025 03:48:44.525048    1726 testtable.go:49] resource.test: Dataset: 0xc420104038, Testtable: map[hello:true world:true] 0xc420104038
begin after======Dataset: 0xc420104038, Testtable: map[hello:true world:true] 0xc420104038
E1025 03:48:44.525065    1726 testtable_test.go:23] : after test======Dataset: 0xc420104058, Testtable: map[] 0xc420104058

Мне не удалось инициализировать мойDict.

Я нашел решение, вместо того, чтобы вызывать resource.MustInitializeResource(), я звоню MustInitialTesttable в test директории пакета.

Работает, но я нене знаю почему.

ERROR: logging before flag.Parse: E1025 09:58:33.200196    1159 testtable.go:29] resource.test: =======init======Testtable:0xc4201de030
goroutine 1 [running, locked to thread]:
runtime/debug.Stack(0xb8d160, 0x2, 0x9011d4)
    external/io_bazel_rules_go_toolchain/src/runtime/debug/stack.go:24 +0xa7
runtime/debug.PrintStack()
    external/io_bazel_rules_go_toolchain/src/runtime/debug/stack.go:16 +0x22
git.llsapp.com/aes/tsubasa/resource/test.init.0()
    resource/test/testtable.go:30 +0xea
ERROR: logging before flag.Parse: E1025 09:58:33.200325    1159 testtable.go:29] resource.test: =======init======Testtable:0xc4201de050
goroutine 1 [running, locked to thread]:
runtime/debug.Stack(0xb8d1a0, 0x2, 0x9011d4)
    external/io_bazel_rules_go_toolchain/src/runtime/debug/stack.go:24 +0xa7
runtime/debug.PrintStack()
    external/io_bazel_rules_go_toolchain/src/runtime/debug/stack.go:16 +0x22
git.llsapp.com/aes/tsubasa/resource/test/testtable_test.init.0()
    resource/test/testtable.go:30 +0xea

Функция init () вызывается дважды. Что означает git.xxx.com/aes/tsubasa/resource/test/testtable_test?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...