首页 > 其他分享 >Go 开发常用操作技巧--字符串

Go 开发常用操作技巧--字符串

时间:2022-10-19 21:32:37浏览次数:47  
标签:Println -- fmt 字符串 str Go main strings

Go 语言字符串的字节使用的是UTF-8编码,是一种变长的编码方式。使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

含中文字符串截取

  1. 字符串的长度

我们可以使用 len()函数来获取字符串的长度,英文为1个字节长度,中文为3个字节长度。可以使用 变量[n]的方式来获取第 n+1 个字节,返回的是对应的 Unicode 值。其中 n 的范围是 [0,len(n)-1]。

由于中文一个字是由多个字节组成,所以直接通过上面切片的方式获取可能会把一个中文字的编码截成两半,导致乱码。解决办法是先将其转为 []rune 类型,然后截取,再转为字符串类型。

示例:

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	str := "go 语言测试字符串"
	fmt.Println(len(str)) //打印字节长度
	fmt.Println(utf8.RuneCountInString(str)) //打印字符串长度

	str1 := str[0:5] //获取字符串前6个字符
	fmt.Println(str1)

	strRune := []rune(str) //字符串转为 []rune类型
	fmt.Println(len(strRune)) //转后的长度
	fmt.Println(string(strRune[0:5])) //获取字符串前6个字符
}

结果:

生成随机字符串

math/rand 包可以生成整型与浮点型伪随机数。

简单示例:

package main
 
import (
	"fmt"
	"math/rand"
	"time"
)
 
func main()  {
	rand.Seed(time.Now().UnixNano()) // 取纳秒时间戳,可以保证每次的随机数种子都不同
	fmt.Println(rand.Int())
	fmt.Println(rand.Int31())
	fmt.Println(rand.Intn(5))
}

自定义生成Rand结构体,设置随机数种子,本质上与Rand提供好的结构体没有太大区别:

  • func NewSource(seed int64) Source
    • 使用给定的种子创建一个伪随机资源。
  • func New(src Source) *Rand
    • 返回一个使用src生产的随机数来生成其他各种分布的随机数值的*Rand

示例:

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	randlen := 5 //设定随机串长度
	str := "0123456789abcdefghijklmnopqrstuvwxyz"
	bytes := []byte(str) //转成数组
	result := []byte{}
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i :=0;i < randlen;i++{
		result = append(result,bytes[r.Intn(len(str))])
	}

	fmt.Println(string(result))
}

大小写

Go 中的 strings 包提供的 ToUpper()/ToLower() 函数,可以将字符串转换成大/小写。

package main
 
import (
	"fmt"
	"strings"
)
 
var orig = "How Are You"
var lower string
var upper string
 
func main() {
	fmt.Printf("%s\n", orig) //How Are You
	lower = strings.ToLower(orig)
	fmt.Printf("%s\n", lower) //how are you
	upper = strings.ToUpper(orig) //HOW ARE YOU
	fmt.Printf("%s\n", upper)
}

去除字符串首尾空格

Go 中的 strings 包提供的 TrimSpace() 函数,可以去除字符串的空格。

package main

import (
	"fmt"
	"strings"
)

func main() {
	str := " hello world "
	str1 := strings.TrimSpace(str)
	str2 := strings.Trim(str," ")
	fmt.Println(str)
	fmt.Println(str1)
	fmt.Println(str2)
}

结果:

 hello world 
hello world
hello world

合并/分割字符串

  1. 合并 Go 中的 strings 包提供的 Join() 函数,可以合并字符串。
package main

import (
	"fmt"
	"strings"
)

func main() {
	str := []string{"hello","world","!"}
	str1 := strings.Join(str,"") //第一个参数是字符串数组,第二个参数是分隔符
	str2 := strings.Join(str,"-") //第一个参数是字符串数组,第二个参数是分隔符
	fmt.Println(str1) // helloworld!
	fmt.Println(str2) // hello-world-!
}
  1. 分割

strings 包提供的 Split()、SplitN()、SplitAfter()、SplitAfterN() 四个函数处理正则分割字符串。

  • Split:分隔符会被去掉,参数1为字符串,参数2为分隔符

  • SplitN:分隔符会被去掉,参数1为字符串,参数2为分隔符,参数3为分割的片数(-1则不限制)

  • SplitAfter:保存分割符,参数1为字符串,参数2为分隔符

  • SplitAfterN:保存分割符,参数1为字符串,参数2为分隔符,参数3为分割的片数(-1则不限制)

Split(s,sep) 等价于 SplitN(s,sep,-1)
SplitAfter(s,sep) 等价于 SplitAfterN(s,sep,-1)

示例:

package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "Hello_World_!"
	res := strings.Split(str,"_")
	fmt.Printf("str:%#v\n",res)
	res1 := strings.SplitN(str,"_",2)
	fmt.Printf("str1:%#v\n",res1)
	res2 := strings.SplitAfter(str,"_")
	fmt.Printf("str2:%#v\n",res2)
	res3 := strings.SplitAfterN(str,"_",2)
	fmt.Printf("str3:%#v\n",res3)
}

结果:

str:[]string{"Hello", "World", "!"}
str1:[]string{"Hello", "World_!"}
str2:[]string{"Hello_", "World_", "!"}
str3:[]string{"Hello_", "World_!"}

标签:Println,--,fmt,字符串,str,Go,main,strings
From: https://blog.51cto.com/wekenw/5768685

相关文章

  • 9 个实用 Shell 脚本,建议收藏!
    1、Dos攻击防范(自动屏蔽攻击IP)#!/bin/bashDATE=$(date+%d/%b/%Y:%H:%M)LOG_FILE=/usr/local/nginx/logs/demo2.access.logABNORMAL_IP=$(tail-n5000$LOG_FILE|grep$D......
  • 手写自定义springboot-starter,感受框架的魅力和原理
    一、前言Springboot的自动配置原理,面试中经常问到,一直看也记不住,不如手写一个starter,加深一下记忆。看了之后发现大部分的starter都是这个原理,实践才会记忆深刻。核心思......
  • ctfshow web130.131(突破正则!)
    if(isset($_POST['f'])){//$f=(String)$_POST['f'];if(preg_match('/.+?ctfshow/is',$f)){die('bye!');}if(stripos($f,'36Dctfshow')=......
  • 付费版 VS Code?脑瓜子嗡嗡的吧!
    今天看到一张图,分享给小伙伴看一下:脑瓜子嗡嗡的吧!这不比每周四vme50,xxkfc来的快,还是给你打折限时活动价,由google正版授权的微软开源vscode。并且还应该会有......
  • [安乐椅#3] 蝴蝶定理
    已知:抛物线\(C:y^2=2px(p>0)\),\(D(n,0),E(m,0)\)为其对称轴上两点,\(M\)是\(C\)上异于原点\(O\)的一动点,直线\(ME\)交\(C\)于\(N\),直线\(MD\)交\(C\)于\(......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够......
  • 使用CSS变量实现主题定制真的很简单
    本文为Varlet组件库源码主题阅读系列第六篇,Varlet支持自定义主题及暗黑模式,本篇文章我们来详细看一下这两者的实现。主题定制Varlet是通过css变量来组织样式的,什么是cs......
  • 常用内置模块
    包的使用#PS:虽然python3之后的版本中并不再要求包内必须含有__init__.py,但是考虑到兼容性问题,我们在创建包文件时,还是推荐加上__init__.py当我们再python中导入包时......
  • 小新学Java2
    一、方法1.方法有返回值和无返回值的区别 2.使用方法时的注意事项①方法应该定义在类中,但是不能在方法中再定义方法。不能嵌套。②方法定义的前后顺序无无所谓。③......
  • 重修 Lucas & exLucas
    Lucas内容\[\binom{ap+b}{cp+d}\equiv\binom{a}{c}\binom{b}{d}\pmod{p}\]其中\(p\)为素数,\(0\leb,d<p\),\[\binom{n}{m}=\frac{n^{\underlinem}}{m!}\]推论(重要)......