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在常用的字符串处理场景中的区别,感兴趣的同学可以自行了解。
PHP转Go系列:字符串的更多相关文章
- str系列---字符串函数
1. strcat extern char *strcat(char *dest,char *src); 把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'. 返回指 ...
- impala系列: 字符串函数
--=======================常用字符串函数--=======================base64decode(string str) : base64 解码.base64 ...
- C开发系列-字符串
C语言字符串 C语言字符串本质是使用字符数组来存储的. #include <stdio.h> int main() { "jake"; // "jake&qu ...
- sql 语句系列(字符串的遍历嵌入删除与统计)[八百章之第十一章]
遍历字符串 我觉得首先要提出一个疑问: 一个数据库本身就是用于存储的,遍历字符串究竟有何意义? 先看如何实现的,毕竟sql service 是没有for循环,也没有loop和while的. selec ...
- 重复造轮子系列--字符串处理(C语言)
这些字符代码是以前写的,源于很久很久以前的一个VC++项目,在当时的部门编程比赛里因为用了项目代码的xsplit函数,万万没想到,那个做了几年的项目里面居然有坑..xsplit函数居然不能split连 ...
- Numpy 系列(十一)- genfromtxt函数
定义输入 genfromtxt的唯一强制参数是数据的源.它可以是字符串,字符串列表或生成器.如果提供了单个字符串,则假定它是本地或远程文件或具有read方法的打开的类文件对象的名称,例如文件或Stri ...
- python中字符串(str)常用操作总结
# 字符串的常用操作方法 (都是形成新的字符串,与原字符串没有关系.) 1.字符串的基本操作之切片 s = 'python hello word' # 取首不取尾,取尾要+1 # 切片取出来的字符串与 ...
- C语言 宽字符串
/* 宽字符串的打印 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...
- python字符串列表元组序列操作
Table of Contents generated with DocToc python系列-字符串.列表.元组的操作 序列的访问及运算符 序列通用操作 访问单个元素 切片访问一部分元素 序列的复 ...
- 学习MySQL之数据类型(四)
一. 整数类型: 整数类型 占用字节 最小值 最大值 TINYINT 1 有符号 -128 无符号0 有符号127 无符号255 SMALLINT 2 有符号-3 2768 无符号0 有符号3 2 ...
随机推荐
- Ionic实现路由ion-tabs
1.导包 <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalabl ...
- GitHub最强技术面试手册:Tech Interview Handbook
摘要: 求职还是需要认真准备的. 原文:超实用技术面试手册,从工作申请.面试考题再到优势谈判,GitHub获30000星 作者:量子位 技术人员求职面试,单刷leetcode上的大厂题库可能还不够. ...
- Hive静态分区和动态分区,对应Mysql中的元数据信息
静态分区: 手动指定分区加载数据,就是常说的静态分区的使用.但是在日常工作中用的比较多的是动态分区. 创建: hive> create table order_mulit_partition( ...
- rsync nfs web01总结
目录 rsync nfs web01总结 要求 部署rsync服务端(172.16.1.41) 部署rsync客户端(172.16.1.31.172.16.1.7) 部署web代码 NFS服务端部署 ...
- 整理几个经常在H5移动端开发遇到的东西。
本篇主要是我个人的学习分享. 1.弹出数字键盘 <!-- 有“#” “*” 符号输入 --> <input type="tel"> <!-- 纯数字 ...
- Less(5)
考查点:双查询报错注入 1.先判断注入类型 (1)首先看到要求,要求传一个ID参数,并且要求是数字型的:?id=1 (2)再输入?id=1' 显示报错,报错多了一个单引号 (3)再输入?id=1'' ...
- poj 1182 食物链 并查集 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=1182 题解 可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用 每个动物都有三个并查集 自己 天敌 捕食 并查集 那么在获得 ...
- Tarjan在图论中的应用(三)——用Tarjan来求解2-SAT
前言 \(2-SAT\)的解法不止一种(例如暴搜?),但最高效的应该还是\(Tarjan\). 说来其实我早就写过用\(Tarjan\)求解\(2-SAT\)的题目了(就是这道题:[2019.8.14 ...
- [Vue专题] 对比vue-cli2.x和vue-cli3.x的搭建
简介:深入了解脚手架vue-cli2.x版本与3.x版本构建项目的区别 搭建前提条件: node环境 node是傻瓜式安装的,直接去官网下载安装不断下一步 命令行输入node -v查询版本号,有版本号 ...
- js SetTimeout传参问题
今天写代码遇到这样一个问题,先上代码 <!--JS方法--> function textout(obj){ if(opac==60){opac=0;return;}; opac+=10; ...