Обертка вокруг ломтика делает странные вещи - PullRequest
0 голосов
/ 21 декабря 2018

Я, вероятно, трачу свое время на реализацию этого, но я ищу способ более легко протолкнуть / щелкнуть фрагмент, поэтому у меня есть это:

package h

import (
    "sync"
    log "github.com/sirupsen/logrus"
)

type List struct {
   internalList []interface{}
    mux sync.Mutex
}


func MakeList(l []interface{}) List{
    return List{l, sync.Mutex{}}
}


func (l List) Add(args ...interface{}) List{
    l.mux.Lock()
    l.internalList = append(l.internalList, args...)
    log.Info(l.internalList)
    l.mux.Unlock()
    return l;
}

func (l List) Push(v interface{}) List {
    l.mux.Lock()
    l.internalList = append(l.internalList, v)
    log.Info("internal:",l.internalList);
    l.mux.Unlock()
    return l;
}


func (l List) Pop() interface{}{
    l.mux.Lock()
    length :=len(l.internalList);
    log.Info("the length is:", length)
    if length < 1 {
        return nil;
    }
    last := l.internalList[length-1]
    l.internalList = l.internalList[:length-1]
    l.mux.Unlock()
    return last;
}

func (l List) GetLength() int {
    return len(l.internalList);
}

func (l List) Shift() interface{} {
    l.mux.Lock()
    if len(l.internalList) < 1 {
        return nil;
    }
    first := l.internalList[0];
    l.internalList = l.internalList[1:]
    l.mux.Unlock()
    return first;
}

func (l List) Unshift(v interface{}){
    l.mux.Lock()
    l.internalList = append([]interface{}{v}, l.internalList...)
    l.mux.Unlock()
}

func (l List) GetValue() []interface{}{
    return l.internalList
}

, а затем я использую его следующим образом:

package main

import (
    "github.com/sirupsen/logrus"
    "huru/h"
    "huru/utils"
)

func main(){

    x := h.List{}
    x.Push(3)
    logrus.Info("value:",x.GetValue())
    logrus.Info("len:",x.GetLength());
    logrus.Info(x.Pop());


}

но странно то, что я получаю это:

INFO[0000] internal:[3]                                 
INFO[0000] value:[]                                     
INFO[0000] len:0                                        
INFO[0000] the length is:0                              
INFO[0000] <nil>        

Я понятия не имею, почему 3 добавляется к срезу, но затем длина среза загадочным образом стремится к нулю икогда я поп () я получаю ноль.Кто-нибудь знает, почему это происходит?

Учитывая существующий ответ, мне интересно, есть ли разница между:

func (l *List) Add(args ...interface{}) *List {
    l.mux.Lock()
    l.internalList = append(l.internalList, args...)
    log.Info(l.internalList)
    l.mux.Unlock()
    return l;
}

func (l *List) Push(v interface{}) *List {
    l.mux.Lock()
    l.internalList = append(l.internalList, v)
    log.Info("internal:",l.internalList)
    l.mux.Unlock()
    return l
}

и

func (l *List) Add(args ...interface{}) List {
    l.mux.Lock()
    l.internalList = append(l.internalList, args...)
    log.Info(l.internalList)
    l.mux.Unlock()
    return *l;
}

func (l *List) Push(v interface{}) List {
    l.mux.Lock()
    l.internalList = append(l.internalList, v)
    log.Info("internal:",l.internalList)
    l.mux.Unlock()
    return *l
}

1 Ответ

0 голосов
/ 21 декабря 2018

Поскольку ваши методы изменяют данные, им необходимо использовать указатели получателей:

func (l *List) Push(v interface{}) List {
    ...
}

В противном случае состояние будет обновлено для копии структуры и потеряно послечто.

Подробнее об этом в Effective Go

Обновление: я заметил, что вы возвращаете обновленное значение из ваших методов.Если копия является именно тем, что вам действительно нужно, вам нужно сохранить получатели значений такими, какие они есть сейчас, но затем использовать возвращаемые значения в вашем коде вызова:

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