英文:
Why comparison between two `*bytes.Buffer` type variables showing they are not equal even though they are same?
问题
这是问题的代码。比较两种缓冲区类型显示它们不相等,但两个*File类型是相等的。
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
}
以下是问题的翻译结果:
这是问题的代码。比较两种缓冲区类型显示它们不相等,但两个*File类型是相等的。
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
}
英文:
Here is the code for the problem. comparing the two buffer types shows they are not equal but two *File types are equal.
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
}
答案1
得分: 5
你正在比较指针,而不是对象。表达式&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) // 打印两个不同的值
fmt.Println(bytes.Compare(v.Bytes(), w.Bytes())) // 0,表示“相等”
关于第二个案例,os.Stdout
是一个包含指向os.File
的指针的全局变量,因此该代码片段比较了指向同一对象的两个指针。
v := os.Stdout
w := os.Stdout
v.Write([]byte("Hello"))
w.Write([]byte("Blah!")) // 不重要
fmt.Println(v == w) // true:v 和 w 指向同一对象!
英文:
You are comparing pointers, not objects. The expression &bytes.Buffer{}
creates a new object in memory and returns a pointer to it. Doing that twice would give two different pointers, since no two objects can reside at the same memory location.
To compare the actual contents of buffers, use something like 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"
Regarding the second case, os.Stdout
is a global variable containing a pointer to os.File
, so the snippet compares two pointers to the same object.
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!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论