Версия 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
?