前言
golang的基本数据类型和很多语言都类似,但是go中int 、float等类型区分32位还是64位,我不知道为什么这样子区分,可能是更加严谨吧,还有golang的string类型也和其它面向对象语言比如java,python有很大的不同。 golang和python一样 也有复数类型,complex128 complex64 ,和float有很大的联系还有需要注意一点的是go中不同类型之间是不能进行大于小于比较的,int32 和int64也是不可以的 而且运算也只能是同类型之间运算
var i int =1 这样是会报错的
f5 :=i+f1
f5 :=1+1.0 这样不会报错
float和complex
- go中是没有float类型的 只有float64 32 尽量使用float64
- float类型后面+i就会推断位complex128类型 其real为0
//float go没有这种类型 只有float32 64 尽量使用float64 var f1 float64 f1 = 1 //还是浮点数 f2 := 1.0 f3 := f1 + f2 //只能浮点数和浮点数相加 // var iiii int =1 这样是会报错的 // f5 :=iiii+f1 f5 :=1+1.0 //这样不会报错 为float64 println(f3,f5) fmt.Println(reflect.TypeOf(f3)) f4 :=1.0i println("========") println(real(f4),imag(f4)) fmt.Printf("---%T----",f4) //complex128
//=================复数=========================== //复数都是浮点类型 var c1 complex128 c1 = 1 + 12i c1 = c1+1.0 //可以直接运算的 1.0的 image=0.0 //c1 = c1+float64(1.0) 这样会报错 c2 := 1 + 12i c3 :=complex(1,12) c4 :=c1+c3 println(c1,c2,c3) println(imag(c4)) var fc complex128 fc =10i //浮点数i 表示实部为0 的复数 println(imag(fc),real(fc))
string
- go中的string默认是utf-8编码 一个中文字符为3个字节
- byte是int8的别名 用来处理 ASCII码
- rune是int32别名 用来处理非utf-8或unicode字符
- `` 代表不转义字符串 原样输出
- string下标访问都是代表字节码长度下标 如s[1]代表访问s的第1个字节码
所以访问utf-8字符的时候要特别小心 最好转化为rune数组来访问
//================字符串======================= //go 字符串默认utf-8 中文占有3字节 s :="abc你好" println(len(s)) //9 //byte 等同于int8,常用来处理ascii字符 //rune 等同于int32,常用来处理unicode或utf-8字符 //uint8=byte var s1 uint8 =s[0] //这里是字节值 var s2 byte =s1 //这里是字节值 //rune == int32 var r1 rune = '你' var r2 int32 = r1 println(s1,s2) println(r1,r2) //反斜杠原样输出不转义 s = `哈bd\n\b\t 太棒了` println(s) s = s[:3] //s还是string类型 这里代表取前三个字节 println(s) //s='哈'
- strings包:(有时间再总结吧,先贴自己学习的代码)
//字符串包 p1 := "a哈bc你de你fg" p2 :="ab" p3 :="fg" println(p1,strings.HasPrefix(p1,p2),strings.HasSuffix(p1,p3)) println(strings.IndexRune(p1,'你'),strings.Index(p1,"你"),strings.IndexByte(p1,'b')) println(strings.Replace(p1,"你","我",5)) //n表示匹配几个 -1表示匹配所有 p4 := "今天天气真好aabb" println(strings.Trim(p4,"今天ab")) //这里会将两个字分别匹配裁剪 fmt.Printf("%q\n",strings.Split(p4,"") ) //单个字符分割 返回slice println("=====================") p5 :="abc 你好 good \t \n hhh " println(p5+"--") p55 :=strings.Fields(p5) //获取单词 以所有空白字符分割 返回的是字符串数组 for i:=0;i<len(p55);i++ { println(p55[i]) } println("=========================")
- byte rune 和 string的转化
便于理解 姑且把 rune和 c中的 char做 类比把
s="你好biningo" //字符串----->byte rune b :=[]byte(s) //用于处理ascii码 默认utf-8 所以汉字为三个字节 fmt.Printf("%s ",b) //%s表示输出utf-8字节表示的字符 fmt.Printf("%d", len(b)) 用于处理utf-8 unicode字符 全部都统一 ASCII码也会变成3个字节 r :=[]rune(s) println(string(r),len(r)) //len(r)==9 string(r)强转为string println(len(s)) //默认len 将字符串转化为字节数组 汉字长度为3 //13 println(string(r[2])) //b
- strcenv包(以后总结)
//===============strconv=========== println("==") println(strconv.IntSize) //int的字节大小64位=8字节 n :=strconv.Itoa(10) //int->string m, _:= strconv.Atoi(n) //string ->int m++ println(n,m) fmt.Printf("%T",m) //输出类型 %T //float->string fs :=strconv.FormatFloat(123.33,'f',5,64) //5代表精度 64代表float64 println(fs) f,_:=strconv.ParseFloat(fs,64) //string->float println(f+1)
指针
和c指针类似
- 注意nil指针
var pp int 没有赋值的是nil指针 指向0这个地址
**pp = 10这样是不合法的**
*pp = i 不合法的
pp = &i这样是可以的
/==============指针=============== var cc int=10 _=cc var p *int = &cc println(&cc,p,&p,*p,cc) //nil指针 var pp *int println(pp) //0 println(pp==nil) //**pp = 10 不合法 空指针 //指针数组 注意定义顺序 var ps [5]*int arr :=[]int{1,2,3,4,5} for i:=0;i<5;i++{ ps[i] = &arr[i] println(ps[i]) }
给类型取别名
type pb=int 建议方式
/======给类型取别名========== type pb=int //建议这种 type pb2 string type( pb3 = float64 pb4 int32 ) var i pb=10 println(i+1)