我对Go中指针的用法有疑问。链接在这里:https://golang.org/pkg/bytes/#example_Buffer。
在type Buffer
部分中,第一个示例:
type Buffer struct {
// contains filtered or unexported fields
}
func main() {
var b bytes.Buffer // A Buffer needs no initialization.
b.Write([]byte("Hello "))
fmt.Fprintf(&b, "world!")
b.WriteTo(os.Stdout)
}
然后在
func (b *Buffer) Write(p []byte) (n int, err error)
我知道func Write
的接收者是(b *Buffer)
,那么为什么在main()
函数中,声明/初始化b
之后,我们可以简单地使用b.Write()
但是不是 (&b).Write()
?
谢谢!
答案 0 :(得分:1)
接收器是一个指针,在b.Write()中,b是可寻址的。因此,在指向b的指针而不是b的副本上调用Write。如果b不可寻址,那么您将收到一个编译错误。例如,这将失败:
with tf.variable_scope('Mixed_6a'):
with tf.variable_scope('Branch_0'):
tower_conv = layers.masked_conv2d(net, 384, 3, stride=2, padding='VALID',scope='Conv2d_1a_3x3')
remove prune ops:
python strip_pruning_vars --checkpoint_path=/tmp/cifar10_train --output_node_names=softmax_linear/softmax_linear_2 --filename=cifar_pruned.pb
I expect to speed up the model via remove the pruned ops
通常:只有在可以接收接收器对象的地址的情况下,才可以使用指针接收器调用方法。编译器传递引用,而不传递此类方法的副本。