相关疑难解决方法(0)

空结构切片的地址

我有一个关于empty structs 的基本问题,并且我试图在尝试获取两个切片的支持数组元素的地址时得到以下不同输出:

a := make([]struct{}, 10)
b := make([]struct{}, 20)
fmt.Println("&a == &b", &a == &b)
fmt.Println("&a[0] == &b[0]", &a[0] == &b[0])
Run Code Online (Sandbox Code Playgroud)

上面的代码片段返回:

&a == &b false
&a[0] == &b[0] true
Run Code Online (Sandbox Code Playgroud)

但是,考虑到以下稍微改变的片段:

a := make([]struct{}, 10)
b := make([]struct{}, 20)
fmt.Println(a[0], &a[0])
fmt.Println("&a == &b", &a == &b)
fmt.Println("&a[0] == &b[0]", &a[0] == &b[0])
Run Code Online (Sandbox Code Playgroud)

上面的代码片段返回:

{} &{}
&a == &b false
&a[0] == &b[0] false
Run Code Online (Sandbox Code Playgroud)

有人可以解释上述差异的原因吗?谢谢!

[跟进]进行以下修改:

package main

import "fmt"

type …
Run Code Online (Sandbox Code Playgroud)

pointers go slice

6
推荐指数
1
解决办法
254
查看次数

golang中struct{}的指针让我困扰的是什么

如果我注释了 fmt.Printf 代码,输出将为 false。但如果取消这两行代码的注释,那就是真的。

为什么?fmt.Printf 可以工作吗?

这是代码:

package main

import "fmt"

func main() {
    type s struct{}
    s1 := new(s)
    s2 := new(s)
    // fmt.Printf("%p\n", s1)
    // fmt.Printf("%p\n", s2)
    fmt.Println(s1 == s2)
}
Run Code Online (Sandbox Code Playgroud)

我知道所有 struct{} 实例都有相同的 addr,所以它应该始终为真。

struct go

6
推荐指数
0
解决办法
109
查看次数

Go 接口比较令人困惑

为什么全局变量a1不等于局部变量a2,而a2等于a3和a4

我很困惑,a1,a2,a3都是通过调用getInterface方法计算的,但是比较它们时,却得到了不同的结果。

谢谢大家看到这个问题。


import "fmt"

var a1 aInterface = getInterface()

type aInterface interface {
    fun1()
}

type aInterfaceImpl struct{}

func (p *aInterfaceImpl) fun1() {
    return
}

func getInterface() aInterface {
    return new(aInterfaceImpl)
}

func main() {
    var a2 aInterface = getInterface()
    var a3 aInterface = getInterface()
    var a4 aInterface = new(aInterfaceImpl)
    fmt.Printf("a1 == a2, %+v\n", a1 == a2) // a1 == a2, false
    fmt.Printf("a2 == a3, %+v\n", a2 == a3) // a2 == a3, true
    fmt.Printf("a2 == a4, %+v\n", a2 …
Run Code Online (Sandbox Code Playgroud)

syntax go

1
推荐指数
1
解决办法
60
查看次数

标签 统计

go ×3

pointers ×1

slice ×1

struct ×1

syntax ×1