package main
import "fmt"
func main() {
//todo:int系列与字符--------------------------
aa := '$'
fmt.Println("aa=", aa) //aa= 36
b := '被'
fmt.Println("b=", b) //b=34987 被字对应的Unicode十进制数值(码值)是34987
a := 10 + b
fmt.Println()
fmt.Println("a=", a) //a=34997
var c byte
c = 97
fmt.Println(c) //97
fmt.Printf("%c\n", c) // a 输出字符a
var e int
e = '被'
fmt.Printf("e=%c,e=%d\n", e, e) //e=被,e=34987
f := 887955555555
fmt.Printf("f代表的字符为%c\n", f) //这个数字太大,utf-8 unicode对照表中没有这么大的数字对应的字符
g := '\n'
fmt.Println("g=", g) //g=10
h := '7'
fmt.Printf("字符h的字符是%c,字符h的十进制码值是%d\n", h, h) //字符h的字符是7,字符h的十进制码值是55
//j := '1999' //todo:超出0~9的整数不能作为字符的,字符本来已经被当做整型在运行,本就是整型的整数就没有必要成为字符了,可以是字符串
//fmt.Printf("j的码值是%d",j)
//todo:注意这里!!!
sli := []int16{22, 'a', '我'} //切片里的每一个元素都在内存里给1个字节的空间对该元素进行表示,这里一个
// 字节表示'我'不够,书写时候不报错,但跑起来会报错,除非改成int16及以上
//sli = append(sli,"你好") //这里即便是sli是[]int64,依然不能把“你好”放进去,因为“你好”是string类型,
//存在类型不匹配的问题,尽管底层是两个字节进行表示
fmt.Println("sli=", sli) //如果sli是[]int16及以上,这里会打印 sli= [22 97 25105]
//todo:string字符串---------------------------------------
//todo:因为string字符串在golang中本质是切片,每一个字符(即数字)本质上又是由连续
//todo:的字节表示的,因此可以进行如下转换,但注意不能用 []int8 []int16,虽然单个
//todo:汉字字符可以用int16两个字节的空间来表示 如: sli := []int16{12,'我'}可以运行不报错
sli2 := []int32("大家好") //todo:只能用[]int32或[]byte,不能用[]int64及其他,由于字符串中有汉字,故用[]byte再转成字符串时可能会乱码
fmt.Println("sli=", sli2) //sli2= [22823 23478 22909]
//todo:内建函数len()对字符串默认取的是以[]byte单字节为一个单位的数量,一个字符串中的汉字3个字节,一个英文字符1个字节,
//todo:以[]int32强转后则以对应的4字节为一个单位计数
n := len("hi大家好")
fmt.Println("n=", n) // n=11
stri := []int32("hi大家好") //只能用[]int32或[]byte,不能用[]int64及其他,由于字符串中有汉字,故用[]byte再转成字符串时有可能会乱码
//用[]byte下一行会输出 stri的类型是[]uint8,值=[104 105 229 164 167 229 174 182 229 165 189]
//nn= 11 且依然输出 hi大家好
fmt.Printf("stri的类型是%T,值=%v\n", stri, stri) //stri的类型是[]int32,值=[104 105 22823 23478 22909]
nn := len(stri) //5
fmt.Println("nn=", nn) //nn=5
fmt.Println(string(stri)) //hi大家好
fmt.Println(string([]int32{26194, 34987, 23376})) //晒被子
//fmt.Println(string([]int64{56,99,34987}))//不能写int64,会报错
bytes := []byte("hello") //todo:每一个字符都在ASCII范围内的,可以用[]byte来转换类型
fmt.Println("bytes=", bytes) //bytes= [104 101 108 108 111]
strs := string([]byte{97, 229, 140, 151, 98})
fmt.Println("strs=", strs) //strs= a北b//todo:三个ASCII码值一起表示一个汉字,和utf-8unicode一个大的数字表示一个汉字一样
//todo:一个字符串一旦赋值完成,该字符串中的任意一个字符都不能再被单独更改。
//todo:但可以先转成切片,修改后再转为字符串来达到修改的目的
zifuchuan := "hi你吃饭了吗"
fmt.Println("字符串截取后为:", zifuchuan[3:]) //字符串截取后为: ��吃饭了吗
qiepian := []int32(zifuchuan)
fmt.Println("处理后再截取为:", qiepian[3:]) //处理后再截取为: [21507 39277 20102 21527]
fmt.Println(string(qiepian[3:])) //吃饭了吗
qiepian[3] = '喝'
fmt.Println(zifuchuan) //hi你吃饭了吗 //todo:可见把字符串当做切片来对某一下标的元素修改,并不能改变字符串,
//todo:只有像81、84、87行那样修改了切片后重新转回字符串才行
fmt.Println(string(qiepian)) //hi你喝饭了吗
//todo:转义符只能在双引号中被识别,反引号中不能被识别
var str string
str = `你好\n世界`
fmt.Println("str=", str) //str= 你好\n世界
str2 := `你好"\n"世界`
fmt.Println("str2=", str2) //str2= 你好"\n"世界
str3 := "你好\n世界"
fmt.Println("str3=", str3)
/*
str3= 你好
世界
*/
}