我对包字节中的Go指针使用有疑问

时间:2019-08-21 05:21:39

标签: go

我对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()

谢谢!

1 个答案:

答案 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

通常:只有在可以接收接收器对象的地址的情况下,才可以使用指针接收器调用方法。编译器传递引用,而不传递此类方法的副本。