前言

       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)