如何定义一个变量接收两种不同的slice返回值

如何定义一个变量接收两种不同的返回值:

返回值1:type []*One

返回值2:type []*Two

One,Two均为struct.

我用var logs []interface{} 怎么不行,interface{}不是可以存放任何值?

如果是我错了,那可有什么可替代的方法实现同样的效果?还是说必须要定义两个变量来接收不同的值?

共 10 个回复


snake117

用interface{} 虽然interface{}是一个可以装入任何类型的接口,但[]interface{}就是一个类型,而不是接口了。

# 0

chenhao

我用var _logs interface{} = nil是可以接收两种不同的返回值,但是没办法使用len(),我需要统计返回的数据条数

# 1

hooluupog

做类型断言了吗?

# 2

chenhao

没有,这么断?我用len(logs.([]interface{})),报错"interface is []*One,not []interface{}"

# 3

hooluupog

var logs []interface{} 如果是要得到logs的长度,直接len(logs),如果是要得到具体某个类型的信息条数(例如One),则len(logs[0].([]*One))

# 4

chenhao

直接len(logs)有误,"invalid argument logs (type interface{}) for len".如果要区分类型的话,还不是要定义两个变量

# 5

jimmykuu

定义OneTwo都能满足的一个interface是比较好的方法。

# 6

chenhao

还是上代码吧. 旧代码:

if _type == 1 {    
    _logs := LogOnesByUserId(id)
    this.TplNames = "history1.html"
    if len(_logs) < 1 {
        this.Data["HasMsg"] = true
        this.Data["MsgType"] = "warning"
        this.Data["Msg"] = "历史记录为空"
    } else {
        this.Data["Data"] = _logs
    }
} else {
    _logs := LogTwosByUserId(id)
    this.TplNames = "history2.html"
    if len(_logs) < 1 {
        this.Data["HasMsg"] = true
        this.Data["MsgType"] = "warning"
        this.Data["Msg"] = "历史记录为空"
    } else {
        this.Data["Data"] = _logs
    }
}

新代码:

var _logs interface{} = nil

if _type == 1 {
    _logs = LogOnesByUserId(id)
    this.TplNames = "history1.html"
} else {
    _logs = LogTwosByUserId(id)
    this.TplNames = "history2.html"
}

if len(_logs) < 1 {
    this.Data["HasMsg"] = true
    this.Data["MsgType"] = "warning"
    this.Data["Msg"] = "历史记录为空"
} else {
    this.Data["Data"] = _logs
}

this.Data["Data"] = _logs

旧代码,结构不清晰,想换成新代码,就是len(_logs) 这步过不去.

# 7

jimmykuu

var length int

if _type == 1 {
    _logs := LogOnesByUserId(id)
    this.TplNames = "history1.html"
    length = len(_logs)
    this.Data["Data"] = _logs
} else {
    _logs := LogTwosByUserId(id)
    length = len(_logs)
    this.Data["Data"] = _logs
}

if length == 0 {
    this.Data["HasMsg"] = true
    this.Data["MsgType"] = "warning"
    this.Data["Msg"] = "历史记录为空"
}

Data直接传进去,其实你后面的HasMsg都不需要的,在模板中通过Data判断就可以了。还有就是不要为了省几行代码搞复杂了,旧代码比你的新代码清晰多了。

# 8

nowayout

LogOnesByUserId和LogTwosByUserId的返回都用指针,返回类型为*[]interface{},在获取两个的返回值后,用类型断言确定是哪种类型

# 9