У карты указателей отличается общий способ использования карт - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу создать кеш с картой.Поскольку map не позволяет ссылаться на его значение, поэтому невозможно изменить значения в вызываемых функциях.

После некоторого поиска я обнаружил, что это возможно с созданием карты указателя (структуры).Это почти решает проблему и может работать как переменная по ссылке. Но, как я обнаружил, некоторые используют этот метод для карты.Я беспокоюсь об использовании этого, чтобы быть безопасным.У кого-нибудь есть опыт использования карты указателя?и правильно ли это использовать?

package main

import "fmt"

type Cache struct {
    name    string
    counter int
}

func incr(c Cache) {
    c.counter += 1
}
func incrp(c *Cache) {
    c.counter += 2
}

func main() {
    m := make(map[string]Cache)
    m["james"] = Cache{name: "James", counter: 10}

    c := m["james"]
    incr(c)
    fmt.Println(c.name, c.counter) // James 10

    mp := make(map[string]*Cache)
    mp["james"] = &Cache{name: "James", counter: 10}
    cp := mp["james"]
    incrp(cp)
    fmt.Println(cp.name, cp.counter) // James 12

}

отредактировано: в моем тексте были некоторые запутанные слова и предложения, которые приводили к недоразумению, поэтому я попытался исправить это

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете сделать это, и у вас все еще будет map не указателей, с получателем указателя на структуре:

package main

import "fmt"

type Cache struct {
    name    string
    counter int
}

func (c *Cache) incr() {    // the '(c *Cache)' is the receiver;
    c.counter += 1          // it makes incr() a method, not just a function
}

func main() {
    m := make(map[string]Cache)
    m["james"] = Cache{name: "James", counter: 10}

    c := m["james"]
    c.incr()
    fmt.Println(c.name, c.counter)
}

Выход:

James 11

Если приемники и методы являются новыми для вас, то здесь они упоминаются в Tour of Go: https://tour.golang.org/methods/1

Обратите внимание на страницу о приемниках указателя несколькими шагами позже в туре: https://tour.golang.org/methods/4

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