返回顶部
首页 > 资讯 > 精选 >为什么 *(*string)(unsafe.Pointer(&b)) 不适用于 bufio.Reader
  • 590
分享到

为什么 *(*string)(unsafe.Pointer(&b)) 不适用于 bufio.Reader

go语言string类 2024-02-09 19:02:56 590人浏览 安东尼
摘要

在Go语言中,我们经常会使用类型转换来进行数据类型的转换。例如,将一个[]byte类型的切片转换为string类型的字符串。通常情况下,我们可以使用`string()`函数来进行类型转

Go语言中,我们经常会使用类型转换来进行数据类型的转换。例如,将一个[]byte类型的切片转换为string类型的字符串。通常情况下,我们可以使用`string()`函数来进行类型转换,但在某些特殊情况下,这种方式会出现问题。在Go语言中,`(string)(unsafe.Pointer(&b))`的方式被称为"魔术指针"方式,用于将一个[]byte类型的切片转换为string类型的字符串。然而,该方式并不适用于bufio.Reader类型。为什么呢?让我们来解答这个问题。

问题内容

我有一个文件。它有一些ip

1.1.1.0/24
1.1.2.0/24
2.2.1.0/24
2.2.2.0/24

我读取此文件进行切片,并使用 *(*string)(unsafe.pointer(&b)) 将 []byte 解析为字符串,但不起作用

func testinitiprangefromfile(t *testing.t) {
   filepath := "/tmp/test"
   file, err := os.open(filepath)
   if err != nil {
      t.errorf("failed to open ip range file:%s, err:%s", filepath, err)
   }
   reader := bufio.newreader(file)
   ranges := make([]string, 0)
   for {
      ip, _, err := reader.readline()
      if err != nil {
         if err == io.eof {
            break
         }
         logger.fatalf("failed to read ip range file, err:%s", err)
      }
      t.logf("ip:%s", *(*string)(unsafe.pointer(&ip)))
      ranges = append(ranges, *(*string)(unsafe.pointer(&ip)))
   }

   t.logf("%v", ranges)
}

结果:

task_test.go:71: ip:1.1.1.0/24
    task_test.go:71: ip:1.1.2.0/24
    task_test.go:71: ip:2.2.1.0/24
    task_test.go:71: ip:2.2.2.0/24
    task_test.go:75: [2.2.2.0/24 1.1.2.0/24 2.2.1.0/24 2.2.2.0/24]

为什么 1.1.1.0/24 更改为 2.2.2.0/24 ?

改变

*(*string)(unsafe.Pointer(&ip))

到字符串(ip)它可以工作

解决方法

因此,虽然将切片标头重新解释为字符串标头,但您所做的方式绝对是疯狂的,并且无法保证正常工作,但这只是间接导致问题的原因。 p>

真正的问题是,您保留了指向 bufio/Reader.ReadLine() 返回值的指针,但该方法的文档说“返回的缓冲区仅在下次调用 ReadLine 之前有效。”这意味着读者以后可以自由地重用该内存,这就是正在发生的事情。

当您以正确的方式进行转换时,string(ip),Go会将缓冲区的内容复制到新创建的字符串中,该字符串在将来仍然有效。但是,当您将切片键入双关语到字符串中时,您会保留完全相同的指针,一旦读取器重新填充其缓冲区,该指针就会停止工作。

如果您决定使用指针欺骗作为性能黑客以避免复制和分配......那就太糟糕了。无论如何,读取器界面都会强制您复制数据,既然如此,您应该只使用 string()

以上就是为什么 *(*string)(unsafe.Pointer(&b)) 不适用于 bufio.Reader的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 为什么 *(*string)(unsafe.Pointer(&b)) 不适用于 bufio.Reader

本文链接: https://lsjlt.com/news/562776.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 为什么 *(*string)(unsafe.Pointer(&b)) 不适用于 bufio.Reader
    在Go语言中,我们经常会使用类型转换来进行数据类型的转换。例如,将一个[]byte类型的切片转换为string类型的字符串。通常情况下,我们可以使用`string()`函数来进行类型转...
    99+
    2024-02-09
    go语言 string类
  • MySQL为什么使用B+树,而不是B树?
    在MySQL中,B+树被广泛应用于索引结构,因为它支持高效的范围查询和区间扫描,并且有助于减少磁盘I/O操作,从而提高查询效率。为什么MySQL使用B+树而不是B树?主要有以下几个原因: 1、B+树可以更好地利用磁盘预读特性 在数据库中,...
    99+
    2023-09-21
    mysql 数据库
  • 为什么 Go 语言不适用于嵌入式系统?
    go语言不适用于嵌入式系统,原因有三:内存消耗高;垃圾回收开销;运行时庞大。 Go 语言不适用于嵌入式系统的原因 Go 语言是一种越来越流行的编程语言,但它并不适用于嵌入式系统。这是由...
    99+
    2024-04-08
    go语言 嵌入式系统 c++ 垃圾回收器
  • 香港服务器为什么不合适用于广告联盟
    香港服务器可能不适合用于广告联盟的原因有以下几点: 速度问题:香港服务器可能会受到网络连接速度较慢的影响,导致广告联盟的网页加载...
    99+
    2024-04-22
    香港服务器 服务器
  • 为什么Java中都不用a.equals(b)判断对象相等
    今天也是向高级程序员学习的一天。组长又说了我用a.equals(b)判断对象相等的问题,一开始我还很奇怪,不都这么用吗 组长:“……” 嗷嗷,原来是这样,那该用什么呢? 组长:“……...
    99+
    2024-04-02
  • 建Mysql数据库时为什么不适用utf8
    本篇文章给大家主要讲的是关于建Mysql数据库时为什么不适用utf8的内容,感兴趣的话就一起来看看这篇文章吧,相信看完建Mysql数据库时为什么不适用utf8对大家多少有点参考价值吧。 当然,现在...
    99+
    2024-04-02
  • 为什么dsa不能用于数据加密
    dsa是一个非对称加密算法,其安全性是基于整数有限域离散对数难题;dsa一般用于数字签名和认证,在dsa数字签名和认证中,发送者使用自己的私钥对文件或消息进行签名,接受者收到消息后使用发送者的公钥来验证签名的真实性。dsa只是一种算法,所以...
    99+
    2024-04-02
  • 云服务器属于资产吗为什么不能用
    云服务器是一种虚拟的资源,通常指的是将计算资源(例如服务器、存储设备、网络等)集中部署在云上,用户可以通过云服务器进行访问、备份和管理这些资源。与传统的物理服务器不同,云服务器可以更加快速地扩展,并且具有更好的可用性和可靠性。但是,云服务器...
    99+
    2023-10-26
    不能用 资产 服务器
  • 云服务器属于资产吗为什么不能用了
    云服务器是一种虚拟化资源,它可以通过互联网连接到服务器,从而使得用户可以在本地访问这些资源。因此,将云服务器用作其主要资产(或主要服务),是不符合 ISO26262 定义的。 云服务器不能被用于访问互联网。使用云服务器访问互联网是违反美国...
    99+
    2023-10-26
    用了 资产 服务器
  • 云服务器属于无形资产吗为什么不能用
    云服务器是一种虚拟的数据中心资源,它可以用来存储和管理大量的计算资源,以满足企业和组织在云计算领域日益增长的需求。云服务器通常通过公有云或者私有云提供,可以通过多种方式访问到。 但是,云服务器也有自己的特点和优势。它们通常采用多租户模式、...
    99+
    2023-10-26
    无形资产 不能用 服务器
  • 华为云服务器租赁属于固定资产吗为什么不能用
    华为云服务器租赁通常被认为是一种虚拟主机服务,因此它们的使用方式与传统虚拟主机不同。 如果您在华为云服务器租赁中添加了许多应用程序或网站,则需要将其托管到云服务器服务提供商的数据中心中。这意味着您将无法直接在自己的本地计算机上使用这些数据...
    99+
    2023-10-26
    华为 不能用 固定资产
  • JavaScript中为什么不能随便使用绝对等于运算符
    小编给大家分享一下JavaScript中为什么不能随便使用绝对等于运算符,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!javascript是一种什么语言javas...
    99+
    2023-06-14
  • 阿里云服务器属于无形资产吗为什么不能用
    阿里云服务器并不属于无形资产,它是一种实物资产,是一种可以用来存储和处理数据的物理设备。因此,你可以使用阿里云服务器来托管你的网站、应用程序或其他在线服务。 然而,阿里云服务器并不是免费的,你需要购买它们并支付相应的费用。此外,你还需要具...
    99+
    2023-10-26
    阿里 无形资产 不能用
  • 阿里云服务器等于1个空间吗为什么不能用
    阿里云服务器是指使用阿里云操作系统提供的云服务器服务,而不是指单独购买一个空间。即使您购买了1个阿里云服务器,空间大小仍然会被用作计算资源的一部分,而不是独立于阿里云提供的云服务器服务。 如果您打算将您的数据上传到阿里云的云服务器上进行托...
    99+
    2023-10-27
    阿里 不能用 服务器
  • 云服务器属于无形资产吗为什么不能用原材料
    1. 云服务器是什么? 云服务器是一种基于云计算技术的虚拟服务器,它可以通过互联网进行访问和管理。与传统的物理服务器不同,云服务器不需要实体硬件设备,而是通过虚拟化技术将多个虚拟服务器部署在同一台物理服务器上,从而实现资源共享和灵活扩展。...
    99+
    2023-10-26
    无形资产 不能用 原材料
  • 阿里云服务器等于1个空间吗为什么不能用了
    首先,阿里云服务器不能用的原因是因为其服务的可靠性不足。阿里云的服务质量一直备受消费者和企业的认可,但是由于一些原因,阿里云服务器的可靠性存在一些问题。比如,一些客户在使用阿里云的服务时,遇到了服务器故障、网络攻击等问题,导致了业务中断。这...
    99+
    2023-10-27
    阿里 用了 服务器
  • 阿里云服务器等于1个空间吗为什么不能用2个
    实际上,阿里云不仅仅提供了1个空间,它还可以用2个或更多的空间,这取决于你所使用的服务器和云服务的容量和可用性。如果你选择了阿里云,你可以将你的服务器分成许多小的可用空间,并将这些小的可用空间分配给你的其他云服务,这样你就可以用2个或更多的...
    99+
    2023-10-27
    阿里 不能用 服务器
  • 云服务器属于无形资产吗为什么不能用原材料支付
    1. 云服务器是无形资产 云服务器是一种虚拟的计算机系统,它不是实体的物品,而是一种无形资产。这意味着它没有实体形态,不能被触摸或感知,只能通过网络进行访问和使用。因此,云服务器不属于原材料或实物类别,不能用原材料支付。 2. 无形资产的...
    99+
    2023-10-26
    无形资产 不能用 原材料
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作