【问题标题】:How can I implement a void* in golang? [duplicate]如何在 golang 中实现 void*? [复制]
【发布时间】:2016-07-20 23:04:55
【问题描述】:

我正在用 Golang 制作一棵(非二叉树)树。

在 Java 中,我会使用类似的东西

 class Node{
   List <Object> data;
 }

data 可以是指向数据的指针,也可以是指向子节点的指针

在 C 或 C++ 中,我会使用 void*。

我应该在golang中使用什么类型

【问题讨论】:

  • 旁注:不要使用 void 指针 :)

标签: go


【解决方案1】:

我从来没有尝试用任何语言解决这个问题,这在 Go 中可以吗?

go play link 编辑在阅读了重复的问题后,我发现您并没有询问实施,无论如何都喜欢♥︎

package main

import (
    "fmt"
)

type Node struct {
    List []*Node
    Data interface{}
}

func main() {
    trivial := Node{}

    leaf := Node{Data: 1}

    tree := Node{
        List: []*Node{
            &leaf,
            &leaf,
        },
    }
    out(trivial)
    out(leaf)
    out(tree)
}

func out(x interface{}) {
    fmt.Printf("%T:%+v\n", x, x)
}

// main.Node:{List:[] Data:<nil>}
// main.Node:{List:[] Data:1}
// main.Node:{List:[0xc82000e180 0xc82000e180] Data:<nil>}

【讨论】:

    【解决方案2】:

    Go 中没有 void 指针。处理这个问题的方法是使用空接口interface{},它固有地由所有类型实现。不久前我问了一个关于这个的问题,你可以在这里找到; Go equivalent of a void pointer in C

    【讨论】:

    • 还有 unsafe.Pointer ,嗯,不太安全,因为它可以被强制转换为任意类型。没错,interface{} 更类似于 Object,尽管它只是一种其他类型都“是”的类型。
    • 派对迟到了,但为了方便其他人阅读本文,@LinearZoetrope 当然可以,但您可以使用Type Assertion 确保他们的安全。
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2023-03-10
    • 2018-03-27
    • 2020-11-01
    • 2017-09-19
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多