6

Golang字符串切割函数Split

 3 years ago
source link: https://studygolang.com/articles/5049?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Golang字符串切割函数Split

Bryce · 2017-02-10 16:00:13 · 54544 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2017-02-10 16:00:13 的文章,其中的信息可能已经有所发展或是发生改变。

先说结论:大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,转载请注明来源!


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

280

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK