Pointers 发送到函数的指针

Pointers 发送到函数的指针,pointers,go,Pointers,Go,我在main()中有以下代码: 我决定为创建单独的函数,而不是匿名函数 我将它声明为funchitCache(cache*ttlru.cache,msgs*chan amqp.Delivery){ 我得到一个编译异常: ./go_server.go:61: cannot use cache (type ttlru.Cache) as type *ttlru.Cache in argument to hitCache: *ttlru.Cache is pointer to interfac

我在
main()
中有以下代码:

我决定为创建单独的函数,而不是匿名函数

我将它声明为func
hitCache(cache*ttlru.cache,msgs*chan amqp.Delivery){

我得到一个编译异常:

./go_server.go:61: cannot use cache (type ttlru.Cache) as type *ttlru.Cache in argument to hitCache:
    *ttlru.Cache is pointer to interface, not interface
./go_server.go:61: cannot use msgs (type <-chan amqp.Delivery) as type *chan amqp.Delivery in argument to hitCache
/go\u server.go:61:无法将缓存(类型ttlru.cache)作为HITCHACHE的参数中的*ttlru.cache类型使用:
*缓存是指向接口的指针,而不是接口

./go_server.go:61:无法使用msgs(type您正在函数签名中使用指针,但没有传递指针-这很好;如注释中所述,没有理由对接口或通道值使用指针。只需将函数签名更改为:

hitCache(cache ttlru.Cache, msgs chan amqp.Delivery)

如果接收变量或函数参数需要一个值,那么它应该可以正常工作。

很好 类型为
*T
——即“指向
T
”的指针, 您有一个类型为
T
的变量来获取指向它的指针, 您必须获取该变量的地址。 这是因为“指针”是一个包含地址的值

Go中的地址接收操作符是
&
,因此您需要

hitCache(&cache, &msgs)
但请注意,有些类型具有所谓的“引用语义”。 也就是说,它们的值保留对某些“隐藏”数据结构的引用。 这意味着当您复制这些值时,您复制的引用都引用相同的数据结构

在Go中,内置类型映射、切片和通道具有引用语义, 因此,您几乎不需要传递指向此类类型的值的指针(好吧,有时可能有用,但现在不行)

接口也可以被认为具有引用语义(现在我们不要离题讨论这个问题),因为任何接口类型的每个值都包含两个指针

因此,在您的情况下,最好不要将函数的形式参数声明为指针,而是将它们声明为“普通”类型,然后使用它



总而言之,你一定要在路上完成一些基本的资源,这些资源会更详细、更广泛地解释这些基本问题。

指向接口的指针几乎从未被使用过。你可以简化事情,使用传递值的接口。

几乎不需要使用指向接口的指针。指向chan的指针是也不常见。
hitCache(&cache, &msgs)