package main
 
import (
	"fmt"
	"strconv"
	"strings"
)
 
// 统计长度:len(str) 内建函数不要引入包包,一个汉字三个字节
// 遍历含有中文的字符串,需要用切片 r := []rune(str)
// 字符串转整数 strconv.Atoi("123")
// 整数转字符串 strconv.Itoa(12345)
func main() {
	//统计长度:len(str) 内建函数不要引入包包,一个汉字三个字节
	str := "hello北"
	fmt.Println("str len = ", len(str))
 
	//遍历含有中文的字符串,需要用切片 r := []rune(str)
	str1 := "hello北京"
	str2 := []rune(str1)
	for i := 0; i < len(str2); i++ {
		fmt.Printf("字符=%c\n", str2[i])
	}
 
	//字符串转整数 strconv.Atoi("123")
	n, err := strconv.Atoi("123")
	if err != nil {
		fmt.Println("转换错误:", err)
	} else {
		fmt.Println("转换结果:", n)
	}
 
	//整数转字符串 strconv.Itoa(12345)
	str3 := strconv.Itoa(12345)
	fmt.Printf("str3 = %v,str3 = %T \n", str3, str3)
 
	// 字符串 转 []byte
	var bytes = []byte("hello go")
	fmt.Printf("byte %v\n", bytes)
	// []byte 转字符串: str = string([]byte{97,98,99})
	str4 := string([]byte{97, 98, 99})
	fmt.Printf("str4 %v\n", str4)
 
	// 10进制,转2、8、16进制 strconv.FormatInt(123,2) 返回对应的字符串
	str = strconv.FormatInt(123, 2)
	fmt.Printf("str 二进制 %v\n", str)
 
	str = strconv.FormatInt(123, 16)
	fmt.Printf("str 16进制 %v\n", str)
 
	// 查找子串是否在指定的字符串中:strings.Contains("seafoo","foo")  //true
	is_check := strings.Contains("seafoo", "foo")
	fmt.Printf("is_check is %v \n", is_check)
 
	// 统计一个字符中,有几个指定的子串 strings.Count("apple","p")
	num := strings.Count("apple", "p")
	fmt.Printf("有 %v个\n", num)
 
	fmt.Println(strings.Count("cheese", "e")) // 3
	fmt.Println(strings.Count("five", ""))    // before & after each rune   // 5
 
	// 不区分大小写的字符串比较(== 是区分大小写的):fmt.Println(strings.EqualFold("abc","ABC"))
	b := strings.EqualFold("abc", "ABC") // strings.EqualFold 不区分大小写
	fmt.Println("strings.EqualFold 判断", b)
	fmt.Println("==判断", "abc" == "Abc") // == 区分大小写
 
	// 返回子串在一个字符串中第一次出现的index值,如果没有则返回-1
	// 也可用于判断是否存在  strings.Index("apple","p")
	index := strings.Index("this is an apple", "p")
	fmt.Println("第一次出现的index值是 ", index)
 
	// 返回子串在字符串中出现的最后一次的位置,如果没有则返回-1  , strings.LastIndex("this is an apple", "p")
	index = strings.LastIndex("this is an apple", "p")
	fmt.Println("最后一次出现index值是 ", index)
 
	// 将指定的子串替换成另一个子串 strings.Replace("go golang", "go", "go语言", n)
	// 在字符串 go golang 中 把 go 替换成 go语言  n标识希望替换几个,如果-1则全部替换
	str = strings.Replace("go go hello", "go", "hi", -1)
	fmt.Println("替换后 ", str)
 
	// 按照指定的某个字符,为分割标识,将一个字符串拆分成字符串数组 strings.Split("Tom go to school"," ")
	strArr := strings.Split("Tom go to school", " ")
	fmt.Printf("strArr %v\n", strArr)
 
	// 将字符串进行大小写转换 strings.ToLower(str) 是转小写  strings.ToUpper(str) 是转大写
	str = "Tom go to school"
	str = strings.ToLower(str)
	fmt.Printf("str ToLower is:  %v\n", str)
	str = strings.ToUpper(str)
	fmt.Printf("str ToUpper is: %v\n", str)
 
	// 将字符串左右两边的空格去掉strings.TrimSpace("  aaa bbb  ")
	str = "   Tom go to school   "
	str = strings.TrimSpace(str)
	fmt.Printf("str TrimSpace is=|%v|\n", str)
 
	// 将字符串左右两边指定的字符去掉 strings.Trim("**aa bb ++", " **++") 去掉两边的 空格、**、++
	str = "** ++Tom **go to ++school **"
	str = strings.Trim(str, " **++")
	fmt.Printf("str Trim is=|%v|\n", str)
 
	// 将字符串左边指定的字符串去掉strings.TrimLeft("**aa bb ++", " **++") 去掉两边的 空格、**、++
	strLeft := "** ++Tom **go to ++school **"
	strLeft = strings.TrimLeft(strLeft, " **++")
	fmt.Printf("str TrimLeft is=|%v|\n", strLeft)
 
	// 将字符串左边指定的字符串去掉strings.TrimRight("**aa bb ++", " **++") 去掉两边的 空格、**、++
	strRight := "** ++Tom **go to ++school **"
	strRight = strings.TrimRight(strRight, " **++")
	fmt.Printf("str TrimRight is=|%v|\n", strRight)
 
	// 判断字符串是否以指定的字符串开头 strings.HasPrefix("ftp://192.168.1.1","ftp") 返回true
	str = "ftp://192.168.1.1"
	fmt.Println("开头是否含有", strings.HasPrefix(str, "ftp"))
 
	// 判断字符串是否以指定的字符串结尾 strings.HasSuffix("abc123.jpg","abc")  返回false
	str = "abc123.jpg"
	fmt.Println("结尾是否含有", strings.HasSuffix(str, "jpg"))
 
}