PHP转Go系列:字符串
字符串的赋值
在php中,字符串的赋值虽然只有一行,其实包含了两步,一是声明变量,二是赋值给变量,同一个变量可以任意重新赋值。
$str = 'hello world!'; $str = 'hia';
go语言实现上述两步也可以用一行语句解决,就是通过标识var
赋值时同时声明变量,切记等号右侧的字符串不能用单引号,对变量的后续赋值也不能再重新声明,否则会报错。除此之外,定义的变量不使用也会报错,从这点来看,go还是比php严格很多的,规避了很多在开发阶段产生的性能问题。
var str = "hello world!" str = "hia"
关于声明,go提供了一种简化方式,不需要在行首写var,只需将等号左侧加上一个冒号就好了,切记这只是替代了声明语句,它并不会像php那样用一个赋值符号来统一所有的赋值操作。
str := "hello world!" str = "hia"
字符串的输出
php中的输出非常简单,一个echo就搞定了。
<?php echo 'hello world!'; ?>
而go不一样的是,调用它的输出函数前需要先引入包fmt
,这个包提供了非常全面的输入输出函数,如果只是输出普通字符串,那么和php对标的函数就是print
了,从这点来看,go更有一种万物皆对象的感觉。
import "fmt" func main() { fmt.print("hello world!") }
在php中还有一个格式化输出函数sprintf
,可以用占位符替换字符串。
echo sprintf('name:%s', '平也'); //name:平也
在go中也有同名同功能的字符串格式化函数。
fmt.print(fmt.sprintf("name:%s", "平也"))
官方提供的默认占位符有以下几种,感兴趣的同学可以自行了解。
bool: %t int, int8 etc.: %d uint, uint8 etc.: %d, %#x if printed with %#v float32, complex64, etc: %g string: %s chan: %p pointer: %p
字符串的相关操作
字符串长度
在php中通过strlen
计算字符串长度。
echo strlen('平也'); //output: 6
在go中也有类似函数len
。
fmt.print(len("平也")) //output: 6
因为统计的是ascii字符个数或字节长度,所以两个汉字被认定为长度6,如果要统计汉字的数量,可以使用如下方法,但要先引入unicode/utf8
包。
import ( "fmt" "unicode/utf8" ) func main() { fmt.print(utf8.runecountinstring("平也")) //output: 2 }
字符串截取
php有一个substr
函数用来截取任意一段字符串。
echo substr('hello,world', 0, 3); //output: hel
go中的写法有些特别,它是将字符串当做数组,截取其中的某段字符,比较麻烦的是,在php中可以将第二个参数设置为负数进行反向取值,但是go无法做到。
str := "hello,world" fmt.print(str[0:3]) //output: hel
字符串搜索
php中使用strpos
查询某个字符串出现的位置。
echo strpos('hello,world', 'l'); //output: 2
go中需要先引入strings
包,再调用index
函数来实现。
fmt.print(strings.index("hello,world", "l")) //output: 2
字符串替换
php中替换字符串使用str_replace
内置函数。
echo str_replace('world', 'girl', 'hello,world'); //output: hello,girl
go中依然需要使用strings
包中的函数replace
,不同的是,第四个参数是必填的,它代表替换的次数,可以为0,代表不替换,但没什么意义。还有就是字符串在php中放在第三个参数,在go中是第一个参数。
fmt.print(strings.replace("hello,world", "world", "girl", 1)) //output: hello,girl
字符串连接
在php中最经典的就是用点来连接字符串。
echo 'hello' . ',' . 'world'; //output: hello,world
在go中用加号来连接字符串。
fmt.print("hello" + "," + "world") //output: hello,world
除此之外,还可以使用strings
包中的join
函数连接,这种写法非常类似与php中的数组拼接字符串函数implode
。
str := []string{"hello", "world"} fmt.print(strings.join(str, ",")) //output: hello,world
字符串编码
php中使用内置函数base64_encode
来进行编码。
echo base64_encode('hello, world'); //output: agvsbg8sihdvcmxk
在go中要先引入encoding/base64
包,并定义一个切片,再通过stdencoding.encodetostring
函数对切片编码,比php要复杂一些。
import ( "encoding/base64" "fmt" ) func main() { str := []byte("hello, world") fmt.print(base64.stdencoding.encodetostring(str)) }
以上是php与go在常用的字符串处理场景中的区别,感兴趣的同学可以自行了解。
下一篇: ES6之箭头函数深入理解
推荐阅读
-
PHP学习系列(1)字符串处理函数(3),php函数
-
整型转字符串 判断是否为指定长度内字符串的php函数
-
PHP字符串函数系列之nl2br(),在字符串中的每个新行 ( ) 之前插入 HTML 换行符br
-
php数组转字符串函数有哪些(最实用的2种方法)
-
php数组转字符串函数有哪些(最实用的2种方法)
-
PHP实现多维数组转字符串和多维数组转一维数组的方法
-
改写函数实现PHP二维/三维数组转字符串
-
PHP字符串函数系列之nl2br(),在字符串中的每个新行 ( ) 之前插入 HTML 换行符br
-
php中的Base62类(适用于数值转字符串)
-
PHP字符串函数系列之nl2br(),在字符串中的每个新行 ( ) 之前插入 HTML 换行符br