Допустим, у меня есть две структуры, которые определяют связанный список:
....
....
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% правы, что я вставляю узел в узел!