Я думаю, вы ожидаете, что 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"
}
, или вы можете сделать все это в одну строку.