美文网首页
go语言学习笔记——类型

go语言学习笔记——类型

作者: 让梦想腾飞 | 来源:发表于2018-11-05 00:34 被阅读0次

    在介绍类型之前,首先要看下变量常量,因为类型是修饰他们的,类型决定了变量的长度和存储方式。
    常量和变量的区别:
    1、常量只读,变量值可变
    2、变量在运行期分配内存,常量会被编译器在预处理阶段直接展开,作为指令数据使用。

    一、变量

    a:=1 //这种简短的方式,是go的特色,用起来很方便的。
    var b int //这种可以用在分支结构里
    if a==1{
          b=1
    }else{
          b=2
    }
    fmt.Println(a,b)// 变量必须要使用哦。。否则编译不过。
    

    二、常量

    不同于变量,常量不使用,不会出错。

    const (
        RED =0+iota//1
        GREEN //2
        BLUE//3
    )
    

    三、字符串类型

    两种声明初始化方式,如下:

    var s string="简书"
    s:="简书"
    

    字符串是不可变的字节序列,遍历时分byte和rune两种类型

    var s string="简书"
    for i:=0;i<len(s);i++{
        fmt.Printf("%d:[%c]\n",i,s[i])
    }//byte格式
    for k,v:=range s{
        fmt.Printf("%d:[%c]\n",k,v)
    }//rune格式
    

    常用函数

    var s string = "简书,很棒!,"
    c := "是呀!"
    ss := strings.Split(s, "")
    st := strings.Trim(s, ",")
    scarr:=[]string{s,c}
    sc := strings.Join(scarr," ")//相比+一次次拼接(每次复制数据,到新分配的内存。) 效率快很多,
    fmt.Println(ss, st, sc)
    
    

    四、切片类型

    var slice []string //声明
    slice:=[]string{}//声明并初始化
    slice:=make([]string,7,10)//指定len 和cap,声明并初始化
    slice=append(slice,"1")//在切片最后一个元素后,追加元素,常用
    

    切片本身是指针包装,传参数不需要传指针。

    五、字典类型

    maptest:=map[string]int{"a":1}//声明并初始化
    val,ok:=maptest["a"]
    fmt.Println(val,ok)//1 true
    

    注意:
    1、不能对nil的map进行写操作,但可读。
    2、删除或新增键值是安全的,如果某个任务正在对字典进行写操作,那么其它任务就不能对该字典进行并发操作(读、写、删除),否则会导致进程崩溃。
    3、字典对象本身是指针包装,传参数不需要传指针。

    六、方法

    注意如下结构体传值、传指针的区别

    package main
    
    import (
        "reflect"
        "fmt"
    )
    
    type S struct {
    }
    type T struct {
        S
    }
    
    func (S) SVal()   {}
    func (*S) SPtr() {}
    func (T) TVal()   {}
    func (*T) TPtr()  {}
    
    func methodSet(a interface{}) {
        t := reflect.TypeOf(a)
        for i, n := 0, t.NumMethod(); i < n; i++ {
            m := t.Method(i)
            fmt.Println(m.Name, m.Type)
        }
    }
    func main() {
        t :=T{}
        methodSet(t)
        fmt.Println("---------")
        methodSet(&t)
    }
    //SVal func(main.T)
    //TVal func(main.T)
    //---------
    //SPtr func(*main.T)
    //SVal func(*main.T)
    //TPtr func(*main.T)
    //TVal func(*main.T)
    

    闭包:阮一峰老师讲的很好,闭包就是子函数返回匿名函数,通过返回的匿名函数,访问子函数的局部变量。

    相关文章

      网友评论

          本文标题:go语言学习笔记——类型

          本文链接:https://www.haomeiwen.com/subject/vzhjxqtx.html