Как запретить другим изменять содержимое возвращаемой структуры - PullRequest
0 голосов
/ 15 января 2020

В моей программе есть кэш для хранения некоторой структуры, а другие могут использовать метод Get для получения соответствующей структуры. Как я могу защитить его от изменения другими, если структура содержит указатель (карту)?

Фон - мои коллеги, и я работаю в одном пакете, и когда они используют функцию get, я просто возвращаю копию своей структуры, но это не будет работать, если структура содержит указатель. Я знаю, что глубокое копирование может быть решением, но если структура содержит какую-то большую карту, глубокое копирование будет болезненным.

Пример кода следующий:

// a.go
package foo

type bar struct {
    largeMap map[int]int
}
var cache map[int]bar
func getById(id int) bar {
    return cache[id]
}

// b.go
package foo
func fun() {
    p := getById(1)
    p.largeMap[2] = 34 // changing the original data in cache!!!!!
}

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Решение - использовать функцию получения.

Мы выделяем все не указательные поля, например, в структуре с именем barPublic. Функция getByID вернет копию этой структуры. Чтобы получить доступ к значениям из карты bar, мы затем используем специальную функцию получения getByIDAndKey.

// struct containing non pointer fields of bar
type barPublic struct {
    x string
}

type bar struct {
    barPublic
    largeMap map[int]int
}

var cache map[int]bar

func getByID(id int) (barPublic, bool) {
    v, ok := cache[id]
    if !ok {
        return barPublic{}, false
    }
    return v.barPublic, true
}

func getByIDAndKey(id, key int) int {
    v, ok := cache[id]
    if !ok {
        return 0, false
    }
    w, ok := v.largeMap[key]
    if !ok {
        return 0, false
    }
    return w, true
}
1 голос
/ 15 января 2020

Как запретить другим пользователям изменять содержимое возвращаемой структуры в [Go]

Вы не можете.

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