Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 动态参数和泛型类型_Pointers_Go_Interface - Fatal编程技术网

Pointers 动态参数和泛型类型

Pointers 动态参数和泛型类型,pointers,go,interface,Pointers,Go,Interface,我有以下代码: 包干管 进口 fmt func testdata接口{}{ 数据=123 } func main{ t:=org 测试与测试 格式打印 e:=1 测试与评价 打印格式 } 我试图添加指向*接口{}的指针,但它会抛出错误,当我打印它时,如何将字符串测试分配给t?现在t将作为组织打印出来 我这样问是因为我不确定如何在这里使用动态类型,例如,josn.Unmarshaldata[]byte,v interface{}我使用了这个函数,它可以将databyte转换为我们想要的任何类型,只

我有以下代码:

包干管 进口 fmt func testdata接口{}{ 数据=123 } func main{ t:=org 测试与测试 格式打印 e:=1 测试与评价 打印格式 } 我试图添加指向*接口{}的指针,但它会抛出错误,当我打印它时,如何将字符串测试分配给t?现在t将作为组织打印出来


我这样问是因为我不确定如何在这里使用动态类型,例如,josn.Unmarshaldata[]byte,v interface{}我使用了这个函数,它可以将databyte转换为我们想要的任何类型,只要我们传递引用

您正在设置接口,而不是基础值。相反,你应该这样做

func test(data interface{}){
  *data.(*string) = "aaa"
}
也就是说,首先获取底层的字符串指针,然后设置它所指向的字符串。

我认为您希望接口比它实际要神奇得多

考虑一下您的程序的这种变体:

package main

import (
    "fmt"
)

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

func main() {
    t := "org"
    test(&t)
    fmt.Println(t)
}
你认为这是打印测试吗?如果是这样,我们还有一个更大的问题:如果不是,那么当直接分配给p时,为什么希望具有p接口{}的版本更改t

如果我们将测试更改为通过*p写入:

如您所料,该程序会进行打印测试

现在剩下的就是处理将p声明为数据接口{}的情况。与中一样,必须首先从数据中的接口对象提取底层*字符串指针。然后可以使用该指针设置main的变量t。您可以通过两个步骤完成此操作:

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

例如,或者您可以在一行中完成所有操作。

但是,如果您使用此解决方案,如果数据不是字符串,程序将死机,在这种情况下,函数应该是testdata string,因为这是它所期望的参数。感谢您的重播,我使用接口{},因为我喜欢参数接受任何可能的类型,我在库中看到json.Unmarshaldata[]byte,v interface{}函数,它接受所有类型并在那里持久化指针,我想知道它们是如何实现的。顺便说一句,我是刚来戈朗的。Java开发者阿德里安快死了吗?也就是说,通过使用接口{},您可以在函数测试中检查实际得到的类型和值。正在执行数据。*字符串断言,而不首先测试您得到的类型是*string。编译器插入一个运行时类型检查,看看它是否为真,如果不是,则调用panic。通常,如果test能够处理,例如*string和*int,则使用接口{}。然后您将编写test来检查它是否得到*string或*int,并基于此执行您认为正确的操作。为了更加通用,您可以像json.Unmarshal那样做,并使用reflect包检查得到的接口值。函数测试越通用,编写它就越困难,所需的运行时代码也越多,因此请确保结果与开销一样有价值。请注意,如果您只想处理*string和*int,编写两个单独的函数,一个接受*string,另一个接受*int。泛型,更容易,编译时也更安全,它让您以一定的编译时成本获得编译时安全性和类型灵活性。
func test(data interface{}) {
    p := data.(*string)
    *p = "test"
}