技术问题

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

posted on 2023-04-21 11:16  西伯尔  阅读(26)  评论(0编辑  收藏  举报