Go автоматическое преобразование типов - сравнение inteface {} с конкретным типом - PullRequest
0 голосов
/ 23 марта 2020

Если я хочу сравнить два типа - string и interface {} Я обычно пишу:

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, то ошибки не было. Но это тот же вариант или я должен написать предыдущий?

1 Ответ

2 голосов
/ 23 марта 2020

Краткий ответ на ваш ближайший вопрос: да , хотя оригинальный код (первый фрагмент вашего вопроса) демонстрирует большую внимательность к проверке типов, поэтому он может быть более правильным с точки зрения разработки программного обеспечения. Трудно сказать, не понимая больше контекста.


Согласно Go spe c:

Значения интерфейса сопоставимы. Два значения интерфейса равны, если они имеют идентичные типы Dynami c и равные значения Dynami c или оба имеют значение nil.

Значение x неинтерфейсного типа X и значение t интерфейсного типа T сравнимы, когда значения типа X сопоставимы, а X реализует T. Они равны, если тип Dynami c t идентичен X, а значение Dynami c t равно x.

Я полагаю, что то, что вы спрашиваете, подпадает под условия второго абзаца здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...