首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go秘密 - Interface{}: 空不是空

在本文中,我们将深入探讨类型,并全面了解它的运作方式。

让我们深入探讨。

1. 接口实际上包含两个东西,而不是一个。

在运行时,这个过程被称为“装箱”值,你可以将想象成这样:

类型描述符是一个包含接口方法集、底层类型以及实现接口的底层类型的方法的小型结构体:

变量中指针指向存储值的内存位置。

当提取一个值时,Go会通过访问类型描述符和指针来“解箱”它,然后使用这些信息创建一个适当类型的新变量。这个过程由Go运行时处理。

“你是如何了解这些秘密的呢?”

你可以通过查看Go运行时存储库了解更多信息,该存储库包含了一系列函数和数据结构,这些函数和数据结构被Go运行时系统用于管理Go程序的执行。

2. 空不是空

当一个变量持有一个值时,并不意味着它等于。下面是一个例子来说明这一点:

在这个例子中,我将x赋值为nil指针int值,但实际结果是"x != nil",即使当我打印x的值时,它也显示为。

这是因为当使用"=="运算符将一个变量与进行比较时,只有当类型描述符和值数据都为时才会返回。

“太荒谬了,我该怎么解决这个问题呢?”

我通常使用反射来解决这个问题,因为我不需要知道底层类型。我还会编写一个实用函数来检查值:

“所以,interface(int64) = 1 和 interface(int32) = 1 不相等... 是吗?”

正如我们之前讨论的,你是正确的,类型为int64的中的值1不等于类型为int32的中的值1。为了确认这一点,我为你运行了一个测试:

总结

这就结束了我们的讨论。你现在完全理解了的工作原理,并可以自信地运用这些知识。

请记住,永远保持学习的态度,并享受其中的乐趣,愉快编码

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OsOWclz1icEgYTrvPWcMy5OA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券