热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go中的bytes.String()vsbytes.Bytes()

如何解决《Go中的bytes.String()vsbytes.Bytes()》经验,为你挑选了1个好方法。

考虑这样的文本文件:

Some text
here.
---
More text
another line.
---
Third part of text.

我想把它分成三部分,除以---分隔符.零件应存储在地图中.

现在,完全相同的程序具有不同的类型.

当我使用时string,一切正常:

KEY: 0
Some text
here.
KEY: 1
More text
another line.
KEY: 2
Third part of text.

https://play.golang.org/p/IcGdoUNcTEe

当我使用时[]byte,事情变得混乱:

KEY: 0
Third part of teKEY: 1
Third part of text.
ne.
KEY: 2
Third part of text.

https://play.golang.org/p/jqLhCrqsvOs

为什么?


计划1(string):

func main() {
    parts := parseParts([]byte(input))

    for k, v := range parts {
        fmt.Printf("KEY: %d\n%s", k, v)
    }
}

func parseParts(input []byte) map[int]string {
    parts := map[int]string{}
    s := bufio.NewScanner(bytes.NewReader(input))
    buf := bytes.Buffer{}
    i := 0
    for s.Scan() {
        if s.Text() == "---" {
            parts[i] = buf.String()
            buf.Reset()
            i++
            continue
        }
        buf.Write(s.Bytes())
        buf.WriteString("\n")
    }
    parts[i] = buf.String()
    return parts
}

计划2([]byte):

func main() {
    parts := parseParts([]byte(input))

    for k, v := range parts {
        fmt.Printf("KEY: %d\n%s", k, v)
    }
}

func parseParts(input []byte) map[int]string {
    parts := map[int]string{}
    s := bufio.NewScanner(bytes.NewReader(input))
    buf := bytes.Buffer{}
    i := 0
    for s.Scan() {
        if s.Text() == "---" {
            parts[i] = buf.String()
            buf.Reset()
            i++
            continue
        }
        buf.Write(s.Bytes())
        buf.WriteString("\n")
    }
    parts[i] = buf.String()
    return parts
}

Darshan Rivk.. 5

在字符串版本中,

parts[i] = buf.String()

parts[i]每次都设置为一个新字符串.在[]byte版本中,

parts[i] = buf.Bytes()

设置parts[i]为每次由同一数组支持的字节切片.对于所有三个切片,支持数组的内容是相同的,但是长度与创建时的长度相匹配,这就是为什么所有三个切片显示相同内容但在不同位置切断的原因.

您可以替换字节切片线

parts[i] = buf.Bytes()

用这样的东西:

bb := buf.Bytes()
b := make([]byte, len(bb))
copy(b, bb)
parts[i] = b

为了使行为与字符串版本匹配.但是字符串版本更容易,更好地匹配您似乎想要做的事情.



1> Darshan Rivk..:

在字符串版本中,

parts[i] = buf.String()

parts[i]每次都设置为一个新字符串.在[]byte版本中,

parts[i] = buf.Bytes()

设置parts[i]为每次由同一数组支持的字节切片.对于所有三个切片,支持数组的内容是相同的,但是长度与创建时的长度相匹配,这就是为什么所有三个切片显示相同内容但在不同位置切断的原因.

您可以替换字节切片线

parts[i] = buf.Bytes()

用这样的东西:

bb := buf.Bytes()
b := make([]byte, len(bb))
copy(b, bb)
parts[i] = b

为了使行为与字符串版本匹配.但是字符串版本更容易,更好地匹配您似乎想要做的事情.


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
author-avatar
沉稳之固_300
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有