Golang字符串切割函数Split

Bryce · · 78178 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

先说结论:大Golang里面,如果一个空字符串通过strings包的Split函数进行切割,那么结果是一个长度为1的数组,里面的内容是一个空字符串。

为了验证,分别在1.0.1、1.1、1.2.2、1.3.3、1.4rc上面进行了测试,验证了上面的结论是正确的。

func main() {
	a := strings.Split("", ";")
	fmt.Printf("%d****%s****\n", len(a), a[0])
}

这个也很好理解。切割一个空字符串,肯定是没办法切的,那么结果就是没切开,把原字符串直接加入结果数组里面而已。只不过一开始有点难理解,因为我们都会认为如果是空字符串去切,结果数组里应该是空的。


最近升级了beego1.4.2,谢大把beego控制器获取请求参数函数Controller.GetInt函数的返回值,由之前的int64改成了int,本来最早用的时候就别扭,如果想取到int64,那直接再加个函数Controller.GetInt64就可以了,结果这么一搞,还得自己惦记着。结果这次谢大果断把Controller.GetInt返回值改了,项目直接编译不过了。

当然,这不算什么,编译不过最起码知道问题出在哪里了。还有一个坑,beego.AppConfig.Strings函数,之前是可以将配置里的字符串通过分号自动切割成数组。结果更新之后,之前的代码返回是空的了(也就是里面是长度是1的空字符串)。这个可害苦了我。看了下源码,发现config包解析配置文件的方法进行了大幅度更新,但是我经过分析,认为并不是这里的错误,反而是另一个地方beego/config.go第111行

func (b *beegoAppConfig) Strings(key string) []string {
	v := b.innerConfig.Strings(RunMode + "::" + key)
	if len(v) == 0 {
		return b.innerConfig.Strings(key)
	}
	return v
}

runmode里获取配置的值,如果没有取到,去取默认值。这里说一下,beego的配置文件支持devproddefault三种模式。如果配置了runmode,根据其在配置文件内查找相应的配置,否则去取默认值。上面的代码大体是这个含义。但是如果没有找到runmode下的配置,此时if的判断是len(v) == 0,而之前从配置文件的实现ini.go里取值的函数如下:

func (c *IniConfigContainer) Strings(key string) []string {
	return strings.Split(c.String(key), ";")
}

它会把取到的字符串进行切割,结合我们上面提到的,无论怎么切割,长度最少是1,所以if判断永远是false,取默认值的逻辑永远不会被执行。修改的方法也很简单,判断语言改成if v[0] == ""即可。完成的beego/config包介绍可以看我之前的文章。我已经给谢大提了Merge Request,但是他一直没有理我。。。


24号谢大合并了我的代码,开心开心开心。

本文所涉及到的完整源码请参考


原文链接:Golang字符串切割函数Split,转载请注明来源!


有疑问加站长微信联系(非本文作者)

本文来自:Cyeam

感谢作者:Bryce

查看原文:Golang字符串切割函数Split

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

78178 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传