Динамический аргумент и общий тип - PullRequest
0 голосов
/ 08 октября 2019

У меня следующий код:

package main

import (
    "fmt"
)

func test(data interface{}) {
    data = "123"
}

func main() {
    t := "org"
    test(&t)
    fmt.Println(t)

    e := 1
    test(&e)
    fmt.Println(e)
}

Я пытался добавить указатель на * interface {}, но он выдает ошибки, как я могу назначить строку "test" для t при ее печати? прямо сейчас t будет напечатано как "org"

Я спрашиваю, потому что я не уверен, как я могу использовать здесь динамический тип, например, josn.Unmarshal(data []byte, v interface{}) Я использовал эту функцию, и она может преобразоватьДанные любого типа, который мы хотим, пока мы передаем ссылку.

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Я думаю, вы ожидаете, что interface будет гораздо более волшебным, чем на самом деле.

Рассмотрите этот вариант вашей программы:

package main

import (
    "fmt"
)

func test(p *string) {
    s := "test"
    p = &s
}

func main() {
    t := "org"
    test(&t)
    fmt.Println(t)
}

Ожидаете ли вы, что это напечатает test? Если так, у нас есть большая проблема. :-) Если нет, то почему вы ожидаете, что версия с p interface{} изменится t при прямом присвоении p?

Если мы изменим test, чтобы записать через *p:

func test(p *string) {
    *p = "test"
}

программа делает печать test, как вы и ожидали.

Все, что осталось сейчас, - это обработать случай, когда pвместо этого объявляется как data interface{}. Как и в ответе bserdar , вы должны сначала извлечь базовый указатель *string из объекта интерфейса в data. Затем вы можете использовать этот указатель для установки переменной main t. Вы можете сделать это в два этапа: например,

func test(data interface{}) {
    p := data.(*string)
    *p = "test"
}

, или вы можете сделать все это в одну строку.

0 голосов
/ 08 октября 2019

Вы устанавливаете интерфейс, а не базовое значение. Вместо этого вы должны сделать

func test(data interface{}){
  *data.(*string) = "aaa"
}

То есть сначала получить указатель на базовую строку, а затем установить указанную строку.

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