package main
import (
    "fmt"
    "strings"
    "strconv"
)


func main(){
    //返回字符串的(字节)长度,相当于PHP的strlen
    str := "hello世界"  //11 ,golang的编码统一为utf-8,字母和数字分别占一个字节,汉子占用3个字节
    // str := "hello"      //5
    fmt.Println(len(str))


    //字符串遍历
    str2 := "hello世界"
    //如果有中文,需要转切片,不然会出现乱码,因为是按照字符串的字节长度遍历
    str2_r := []rune(str2)
    for i := 0; i < len(str2_r); i++ {
        fmt.Printf("%c\n",str2_r[i])
    }


    //字符串转整数
    //第一个参数是要转化成的字符串,第二个是错误信息.这里需要引用strconv包
    n, err := strconv.Atoi("123")  
    if err != nil { //如果有错
        fmt.Println("转换错误", err)
    } else {    //如果成功
        fmt.Println("转换成功", n)
    }    


    //整数转字符串 
    str = strconv.Itoa(12345)
    fmt.Printf("str=%v, str=%T", str, str)    //str=12345, str=string


    //字符串转[]byte
    var  bytes = []byte("hello golang")
    fmt.Println(bytes) //str=12345, str=string[104 101 108 108 111 32 103 111 108 97 110 103]


    //[]byte转字符串
    str = string([]byte{97, 98, 99})
    fmt.Println(str)  //abc  的asc码分别是97,98,99

    //十进制转化成2,8,16进制,返回对应的字符串
    str = strconv.FormatInt(123, 2)
    fmt.Printf("123对应的二进制是=%v\n", str)
    str = strconv.FormatInt(123, 8)
    fmt.Printf("123对应的八进制是=%v\n", str)
    str = strconv.FormatInt(123, 16) 
    fmt.Printf("123对应的十六进制是=%v\n", str)
    //123对应的二进制是=1111011
    //123对应的八进制是=173
    //123对应的十六进制是=7b


    //判断一个字符串中是否包含指定字符串  ,相当于php中的strpos,但是php中可能会返回下标
    status := strings.Contains("hello world", "hello")
    fmt.Printf("status=%v\n", status)   //status=true

    //统计一个字符串中有几个指定的字符
    count := strings.Count("hello world", "l")
    fmt.Printf("字符存在个数:%v\n", count) //字符存在个数:3;如果没有,则0

    //字符串比较:不区分大小写
    status = strings.EqualFold("abc", "ABC")  
    fmt.Printf("status=%v\n", status)    //status=true

    //字符串比较:区分大小写  两个=
    fmt.Printf("status=%v", "abc" == "ABC")//status=false 
    
    //返回子字符串在指定字符串中第一次出现的index值(位置),如果没有返回-1
    index := strings.Index("test_str", "s")
    fmt.Printf("index=%v", index)  //index=2
}