技术问题
1、我想在cli的函数中给wsc对象的某个属性赋值
考虑以下三种方案:
- 回调:需要把函数作为参数。这个匿名函数的参数不可修改,而且是来自控制台输入,没办法。
- context:把context本身作为参数传递,context里面放wsc对象。还是改不了参数,没办法。
- 全局:由于有多处调用,都需要相同的根wsc。只能全局了,把wsc声明为全局变量。
- 要么是wsc的设计不合理,考虑不同的动作是否应该设计到同一个结构体上?
- 要么wsc应该设置为全局指针,像*DB一样!
var connCmd = &cobra.Command{
Use: "conn [addr]",
Short: "连接服务器",
Long: `指令用法:
conn 127.0.0.1:8888 和服务器建立ws连接,地址格式"127.0.0.1:8888",超时时间单位是s
-to, --timeout int 超时时间,单位s,默认是5s【简写只能是一个字母吗?可以是两个吗 to?】
`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
wsc := service.NewVTVLMsg(args[0], global.API_CONN, timeout)
wsc.Start()
},
}
怎么使用context,怎么使用回调?
语言问题
1、import cycle not allowed
go语言不允许循环引用
我的global包中,用到了service的结构体指针对象
而service中,又用到了global中的全局对象,必然是循环了!
解决方案:
在项目再加一层 package c
怎么折腾service都不行,问题出在global,而非service。
最根本原因是:service的东西不能放到global里面,范围太大了!
global里面只放外部可直接用的包,例如:
package global
import (
"go.uber.org/zap"
"general_server/config"
"general_server/utils/IotDBClient"
"github.com/go-redis/redis"
"github.com/spf13/viper"
"gorm.io/gorm"
)
var (
GVA_DB *gorm.DB
GVA_REDIS *redis.Client
GVA_IotDB *IotDBClient.IotDBClient
GVA_CONFIG config.Server
GVA_VP *viper.Viper
GVA_LOG *zap.Logger
)
参考:
https://blog.csdn.net/ZST1158079421/article/details/90234403
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。