dsifjgogw48491752 2018-04-18 20:10
浏览 43

在函数中附加要切片的项不会更改原始切片

Can someone explain why the two aren't equivalent? The latter does build, but doesn't work as expected. I thought slices would be changed automatically, as contain a pointer to the array.

// Working spec

func TestProcessRecords(t *testing.T) {
    var messageSent []*sqs.SendMessageInput
    w := &SQSWriter{
        queueURL: aws.String("aQueueURL"),
        service: &mock.SQS{
            SendMessageStub: func(input *sqs.SendMessageInput) (*sqs.SendMessageOutput, error) {
                messageSent = append(messageSent, input)
                return nil, nil
            },
        },
    }
    inputEvent := readFirehoseEventFromFile(t, "../../../../testdata/firehose_event.json")
    processRecords(inputEvent.Records, w)
    assert.Equal(t, 2, len(inputEvent.Records))
    assert.Equal(t, 1, len(messageSent))
}

Attempted refactoring, as the mockedWriter will be used across specs

// Not Working spec

func mockWriter(messageSent []*sqs.SendMessageInput) *SQSWriter{
    return &SQSWriter{
        queueURL: aws.String("aQueueURL"),
        service: &mock.SQS{
            SendMessageStub: func(input *sqs.SendMessageInput) (*sqs.SendMessageOutput, error) {
                messageSent = append(messageSent, input)
                return nil, nil
            },
        },
    }
}

func TestProcessRecords(t *testing.T) {
    messageSent := []*sqs.SendMessageInput{}
    inputEvent := readFirehoseEventFromFile(t, "../../../../testdata/firehose_event.json")
    processRecords(inputEvent.Records, mockWriter(messageSent))
    assert.Equal(t, 2, len(inputEvent.Records))
    assert.Equal(t, 1, len(messageSent))
}

I should mention that I'm coming from a background in JS/Ruby/Python, and it is taking a bit of time to get a firmer grasp of go fundamentals.

Thanks in advance

  • 写回答

1条回答 默认 最新

  • du521521521 2018-04-18 20:21
    关注

    This was the answer, all credits to @mkopriva.

    func mockWriter(messageSent *[]*sqs.SendMessageInput) *SQSWriter{
        return &SQSWriter{
            queueURL: aws.String("aQueueURL"),
            service: &mock.SQS{
                SendMessageStub: func(input *sqs.SendMessageInput) (*sqs.SendMessageOutput, error) {
                    *messageSent = *append(messageSent, input)
                    return nil, nil
                },
            },
        }
    }
    
    func TestProcessRecords(t *testing.T) {
        messageSent := []*sqs.SendMessageInput{}
        inputEvent := readFirehoseEventFromFile(t, "../../../../testdata/firehose_event.json")
        processRecords(inputEvent.Records, mockWriter(&messageSent))
        assert.Equal(t, 2, len(inputEvent.Records))
        assert.Equal(t, 1, len(messageSent))
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度