strings包
strings.HasPrefix(s, prefix string) bool
判断字符串s是否以prefix开头。类似于python中的startswith。
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.HasPrefix("http://www.bilibli.com", "https"))//false
fmt.Println(strings.HasPrefix("http://www.bilibli.com", "http"))//true
}
strings.HasSuffix(s, suffix string) bool
判断字符串s是否以suffix结尾,类似于python中的endswith
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.HasSuffix("你是谁啊","谁")) //false
fmt.Println(strings.HasSuffix("你是谁啊", "谁啊"))//true
}
strings.Index(s, substr string) int
判断子串substr在字符串s中首次出现的位置,如果没有则返回-1,类似于python中的find
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Index("我是一匹风中的狼", "风")) //12
fmt.Println(strings.Index("我是一匹风中的狼", "疯"))//-1
//首先第二个返回-1很好理解,但是第一个为什么返回12,如果在python中会返回4
//但是由于golang不是unicode,而是按照字节算的,一个汉字占三个字节,所以是12
//0-1-2 3-4-5 6-7-8 9-10-11, 所以是12
}
strings.LastIndex(s, substr string) int
判断子串substr在子串中最后一次出现的位置,类似于python中的rfind,如果没有,返回-1
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.LastIndex("abcabcabc", "c")) //8
fmt.Println(strings.Index("abcabcabc", "d"))//-1
}
strings.Replace(s, old, new string, n int) string
将字符串s中old替换为new,n为替换的个数,如果为-1,则全部替换,类似于python中的replace
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Replace("abcabcabc", "c", "d", 2)) //abdabdabc
fmt.Println(strings.Replace("abcabcabc", "c", "d", -1)) //abdabdabd
}
strings.Count(s, substr string) int
计算字符串s中,子串substr出现的次数,类似于python中的count
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Count("abcabcabc", "a")) //3
fmt.Println(strings.Count("abcabcabc", "d")) //0
}
strings.Repeat(s string, count int) string
将字符串s重复count次,类似于python中的s * count
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Repeat("abc", 3)) //abcabcabc
fmt.Println(strings.Repeat("abc", 1)) //abc
}
strings.ToLower(s string) string
将字符串s转成小写,类似于python中的lower
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.ToLower("aBc")) //abc
fmt.Println(strings.ToLower("ABc")) //abc
}
strings.ToUpper(s string) string
将字符串s转成大写,类似于python中的upper
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.ToUpper("aBc")) //ABC
fmt.Println(strings.ToUpper("ABc")) //ABC
}
strings.TrimSpace(s string) string
去掉字符串s首尾空格,类似于python中的strip
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.TrimSpace(" aBc ")) //aBc
}
strings.Trim(s string, cutset string) string
对字符串s的两端进行搜索,如果字符再cutset里面,那么就删掉,直到出现一个不在cutset里面的字符为止。仍类似于python中的strip
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Trim("abbb我是来自东方的狼bbba", "ab")) //我是来自东方的狼
fmt.Println(strings.Trim("abbcb我是来自东方的狼cbbba", "ab")) //cb我是来自东方的狼c
}
strings.TrimLeft(s string, cutset string) string
和Trim类似,不过TrimLeft是去除左边的字符,类似于python中lstrip
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.TrimLeft("abbb我是来自东方的狼bbba", "ab")) //我是来自东方的狼bbba
fmt.Println(strings.TrimLeft("abbcb我是来自东方的狼cbbba", "ab")) //cb我是来自东方的狼cbbba
}
strings.TrimRight(s string, cutset string) string
和Trim类似,不过TrimRight是去除右边的字符,类似于python中rstrip
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.TrimRight("abbb我是来自东方的狼bbba", "ab")) //abbb我是来自东方的狼
fmt.Println(strings.TrimRight("abbcb我是来自东方的狼cbbba", "ab")) //abbcb我是来自东方的狼c
}
strings.Fields(s string) []string
对字符串s按照空格分割,返回一个切片,类似于python中的split
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Fields("when i was young")) //[when i was young]
}
strings.Split(s, sep string) []string
对s按照sep进行分割,还是类似于python中的split
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Split("abc|abc|abc", "|")) //[abc abc abc]
}
strings.SplitN(s, sep string, n int) []string
对s按照sep分割,但是只分割n-1个,为什么是n-1,这里表示的是到第n个分割符就不分了。仍然类似于python中的split
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.SplitN("abc|abc|abc|cca|aae|aaa", "|", 4)) //[abc abc abc cca|aae|aaa]
//n=4表示到第4个|就不分割了,总共五个,还剩下两个|
//值得一提的是,如果n=0,得到空切片,
// n=1,第一个分割符就停止了,相当于没分隔,但得到的是由一个原始的字符串组成的切片
//n<0表示全部分割
fmt.Println(strings.SplitN("abc|abc|abc|cca|aae|aaa", "|", 1)) //[abc|abc|abc|cca|aae|aaa]
fmt.Println(strings.SplitN("abc|abc|abc|cca|aae|aaa", "|", -1)) //[abc abc abc cca aae aaa]
}
strings.Join(a []string, sep string) string
将切片s里面的元素用sep连接起来,类似于python中的join
package main
import (
"fmt"
"strings"
)
func main(){
fmt.Println(strings.Join([]string{"a", "蛤", "嗝"}, "^_^")) //a^_^蛤^_^嗝
}
strconv包
strconv.Atoi(s string) (int, error)
将字符串转化为int
package main
import (
"fmt"
"strconv"
)
func main() {
num, err:=strconv.Atoi("123")
if err!=nil{
fmt.Println(err)
}else{
fmt.Printf("%d %T\n", num, num) //123 int
}
num, err=strconv.Atoi("aaa123")
if err!=nil{
fmt.Println(err) //strconv.Atoi: parsing "aaa123": invalid syntax
}else{
fmt.Printf("%d %T\n", num, num)
}
//只有字符串里面的元素全为int类型时,才可以转换
num, err=strconv.Atoi("000123")
if err!=nil{
fmt.Println(err)
}else{
fmt.Printf("%d %T", num, num) //123 int
}
//可以看到如果开头是0的话,转化为int之后,会自动截断
}
strconv.Itoa(i int) string
将int转化为string类型
package main
import (
"fmt"
"strconv"
)
func main() {
s := strconv.Itoa(123)
fmt.Printf("%q %T\n", s, s) // "123" string
/*
熟悉python的小伙伴或许有疑问了,我能不能这么转呢?string(123)
答案是不行的,如果这样的话,那么123会被当成ascii码来处理
*/
//比如
a := 'c'
fmt.Println(a) //99
fmt.Println('c' + 100) //199
//可以看到字节实际上对应的是ascii码,字符串底层则是对应的字节数组
//byte相当于uint8的别名
b := []byte{97, 98, 99, 'd'}
fmt.Println(b) // [97 98 99 100]
//可以将字节数组转为string,会将底层的字节全部拼接起来。
fmt.Println(string(b)) //abcd
//既然byte是unit8的别名,那就意味这数组的最大值不能超过255,那汉字怎么表示呢?可以使用rune
//rune相当于是uint32的别名
r := []rune{'我', '要', '艹', '你', '啊'}
//可以看到字节底层对应的就是一个数字
fmt.Println(r) // [25105 35201 33401 20320 21834]
fmt.Println(string(r)) //我要艹你啊
//因此如果我使用string的方式转换int的话
fmt.Println(string(25105), string(35201), string(33401)) //我 要 艹
//实际上是将这些数字对应的单个字符转换成了字符串。
//因为我们要使用string.Itoa的方式,或者使用SPrintf,SPrint等方法
//同理,字符串转int,也不能使用int("123")这种方式
str := fmt.Sprintf("my age is %d", 16)
fmt.Println(str) //my age is 16
str = fmt.Sprint("my age is ", 16)
fmt.Println(str) //my age is 16
}