登录
首页 >  Golang >  Go问答

为什么两个相同的“*bytes.Buffer”类型变量之间的比较结果却显示它们不相等?

来源:stackoverflow

时间:2024-02-19 13:39:20 377浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《为什么两个相同的“*bytes.Buffer”类型变量之间的比较结果却显示它们不相等?》,涉及到,有需要的可以收藏一下

问题内容

这是问题的代码。比较两个缓冲区类型表明它们不相等,但两个 *文件类型相等。

func main() {
    var v, w io.Writer
    v := &bytes.Buffer{}
    w := &bytes.Buffer{}
    v.Write([]byte("Hello"))
    w.Write([]byte("Hello"))
    fmt.Println(v == w) // false

    v := os.Stdout
    w := os.Stdout
    v.Write([]byte("Hello"))
    w.Write([]byte("Hello"))
    fmt.Println(v == w) // true

}

正确答案


您正在比较指针,而不是对象。表达式 &bytes.buffer{} 在内存中创建一个新对象并返回指向它的指针。这样做两次将给出两个不同的指针,因为没有两个对象可以驻留在同一内存位置。

要比较缓冲区的实际内容,请使用类似 bytes.compare(v.bytes(), w.bytes())

v := &bytes.buffer{}
    w := &bytes.buffer{}
    v.write([]byte("hello"))
    w.write([]byte("hello"))
    fmt.printf("%p, %p\n", v, w)                     // prints 2 different values
    fmt.println(bytes.compare(v.bytes(), w.bytes())) // 0, means "equal"

关于第二种情况,os.stdout 是一个全局变量,包含指向 os.file 的指针,因此该代码片段比较两个指向同一对象的指针。

v := os.Stdout
    w := os.Stdout
    v.Write([]byte("Hello"))
    w.Write([]byte("Blah!")) // doesn't matter
    fmt.Println(v == w) // true: v and w point to the same object!

今天关于《为什么两个相同的“*bytes.Buffer”类型变量之间的比较结果却显示它们不相等?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>