我有一个全局变量,它读取我在不同函数中使用的配置文件。当我执行main方法,并尝试从配置中读取一个值时,该值还没有准备好,所以我得到一个奇怪的值:ᾐ
,它应该是8080.等待的正确方法是什么全局变量准备就绪。
var conf = getGeneralConfig()
func main() {
router := mux.NewRouter()
fmt.Println(":" + string(conf.PORT))
router.HandleFunc("/add", add).Methods("POST")
// conf is not yet ready here
log.Fatal(http.ListenAndServe(":"+string(conf.PORT), router))
}
提前致谢。
答案 0 :(得分:4)
在main()
运行之前初始化变量。有关所有详细信息,请参阅语言规范的package initialization section。
问题在于字符串转换string(conf.PORT)
。 specification says this about the conversion used in the application:
将有符号或无符号整数值转换为字符串类型会产生一个包含整数的UTF-8表示的字符串。
字符串“ᾐ”是符文8080的UTF-8编码。修复方法是使用strconv.Itoa
log.Fatal(http.ListenAndServe(":"+strconv.Itoa(conf.PORT), router))
或fmt.Sprintf将整数转换为十进制表示
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d",conf.PORT), router))
更灵活,更简单的方法是将完整地址指定为配置中的字符串。这允许在配置中指定IP地址。
答案 1 :(得分:1)
问题是将int转换为string时。只需使用strconv
包将int
值转换为string
为:
package main
import (
"fmt"
"strconv"
)
var conf = getGeneralConfig()
func getGeneralConfig() int {
return 8080
}
func main() {
//router := mux.NewRouter()
fmt.Println(":" + strconv.Itoa(conf))
// router.HandleFunc("/add", add).Methods("POST")
// conf is not yet ready here
// log.Fatal(http.ListenAndServe(":"+string(conf.PORT), router))
}