【问题标题】:Go auto type conversion - comparing inteface{} to concrete typeGo 自动类型转换 - 将 interface{} 与具体类型进行比较
【发布时间】:2020-07-03 18:18:54
【问题描述】:

如果我想比较两种类型 - stringinterface{} 我通常会这样写:

package main

import "log"

func main() {
    var p1 interface{}
    var p2 string

    p1 = "123"
    p2 = "123"

    if v, ok := p1.(string); ok {
        log.Println(v == p2)
    } else {
        log.Println("false")    
    }
}

我认为它是 type(p1) != string 时的保存变体。 但是如果我写是正确的吗?:

package main

import "log"

func main() {
    var p1 interface{}
    var p2 string

    p1 = "123"
    p2 = "123"

    log.Println(p1 == p2)
}

如果 type(p1) != string 没有错误。但它是相同的变体还是我应该写前一个?

【问题讨论】:

标签: go


【解决方案1】:

对您当前问题的简短回答是,尽管原始代码(您问题中的第一个 sn-p)显示出对类型检查的更多考虑,因此从软件工程的角度来看它可能更正确看法。不了解更多上下文就很难判断。


根据Go spec

接口值具有可比性。两个接口值相等,如果 它们具有相同的动态类型和相同的动态值,或者如果两者都有 值为零。

非接口类型 X 的值 x 和接口类型 T 的值 t 当类型 X 的值是可比较的并且 X 实现时是可比较的 T. 如果 t 的动态类型与 X 和 t 相同,则它们相等 动态值等于 x。

我相信您的要求属于此处第二段的条款。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 2023-03-17
    • 2015-01-31
    • 2023-03-29
    • 1970-01-01
    • 2019-05-28
    • 2018-11-08
    • 2023-03-16
    相关资源
    最近更新 更多