Сравнение указанного поля внутренней структуры со строковым типом в go - PullRequest
0 голосов
/ 30 мая 2020

Допустим, у меня есть две структуры, которые определяют связанный список:

....
....

type node struct {
    item interface{}
    next *node
}

type LinkedList struct {
    first *node
    N int
}

...
...

, и я хочу сравнить значение типа базового узла, скажем, в функции поиска, где мы проверяем, k == node.item таким образом, что:

func (l *LinkedList) find (key interface{}) bool {

    result := false
    if !l.isEmpty() {
        for x:= l.first; x != nil; x = x.next {
            if x.item == key {
                result = true 
                break
            }
        }
    return result
}

это не будет работать для ожидаемой функции поиска, потому что базовые типы различны, поэтому fun c всегда будет возвращать false. Мы можем подтвердить это, отразив тип:

fmt.Println(reflect.TypeOf(key), reflect.TypeOf(x.item)) 
>>> string, *main.node

Пробовали обходные пути?

Я попытался подтвердить тип, но, увы, это не работает и вызывает панику

tmp := x.item.(string)
>>>panic: interface conversion: interface {} is *main.node, not string

Этот случай такой же, как и при использовании fmt.Sprintf(x.item)

Я немного озадачен относительно того, где отсюда перейти к go. Есть ли способ сделать это?

Вставка элемента в связанный список Следующий фрагмент должен прояснить, как обрабатывается вставка

func (l *LinkedList) insertFirst(item interface{}) {
    var first *node = new(node)
    oldfirst := l.first
    first.item = item
    first.next = oldfirst
    l.first = first
    l.N++
}

.....
//which gets called somewhere like
var n *node = new(node)
n.item = item
l.insertFirst(n)


.....wait no theres the error! 
----------

burak-serdar, вы на 100% правы, что я вставляю узел в узел!

1 Ответ

1 голос
/ 30 мая 2020

Сравнение интерфейсов в find() является допустимым сравнением, и оно будет работать, если тип ключа и тип значения, хранящегося в узле, совпадают. Однако свидетельства указывают на то, что вы добавляете узел вместо значения.

...