Почему указатель на Go bytes.Buffer необходим при передаче его другой функции? - PullRequest
0 голосов
/ 31 августа 2018

В приведенном ниже коде write_commas требует, чтобы параметр буфера был указателем. Это работает.

Альтернатива (т.е. НЕ использует указатель) приводит к пустому выводу.

Почему при прохождении фактического bytes.Buffer ничего не печатается? Или, другими словами, передача фактической bytes.Buffer создает копию и, таким образом, байты записываются в буфер, который ничего не читает?

package main

import (
    "fmt"
    "bytes"
)

func main() {
    s := "1234567898"
    fmt.Println(Comma(s))

}

func Comma(s string) string {
    var buf bytes.Buffer  // <-- bytes.Buffer declared here.
    sbytes := []byte(s)
    decimal := bytes.LastIndex(sbytes,[]byte("."))
    if decimal > 0 {
        whole_part := sbytes[:decimal]
        write_commas(whole_part, &buf)  // <-- Address

        float_part := sbytes[decimal:len(sbytes)]
        for i := len(float_part); i > 0; i-- {
            buf.WriteByte(float_part[len(float_part)-i])
        }
    } else {.
        write_commas(sbytes, &buf)  // <-- Address
    }

    return buf.String()
}

func write_commas(byr []byte, buf *bytes.Buffer) { // <-- Why *bytes.Buffer?
    for i := len(byr); i > 0; i-- {
        buf.WriteByte(byte(byr[len(byr)-i]))
        if i > 1 && (i-1) % 3 == 0 {
            buf.WriteByte(',')
        }
    }
}

1 Ответ

0 голосов
/ 31 августа 2018

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

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