美文网首页
Golang的一些基础语法范式

Golang的一些基础语法范式

作者: Congroo_027c | 来源:发表于2019-02-24 10:08 被阅读0次

    主要记录一些Golang里面的基本语法范式,因为Golang这玩意实在语法和一般编程语言太特么不一样了...

    数组和切片的初始化

    切片是Golang中关于数组的一个概念,它很类似于SQL语言中的视图概念,即它类似一个实体数据的镜像或快照,同时一般情况下在Golang实际项目中我们也更多的会去使用切片而不是数组本体

    // 数组的初始化
    var array = [5]int                  // 仅声明
    array := [5]int                     // 另外一种写法,也是一般函数体中用的更多的写法
    array := [5]int{1, 2, 3, 4, 5}      // 定长数组声明且赋值
    array := [...]int{1, 2, 3, 4, 5}    // 不定长数组声明且赋值
    
    // 切片的初始化
    slice := []int{}                    // 只声明,不赋值,不规定length,不规定cap
    slice := make([]int, 5)             // 只声明,不赋值,只规定length,不规定cap
    slice := make([]int, 5, 10)         // 只声明,不赋值,规定length,也规定cap
    slice := []int{1, 2, 3, 4, 5}       // 声明且赋值
    
    // 切片&数组添加元素
    var s []int
    
    // 添加一个空切片
    s = append(s, 0)
    
    // 这个切片会按需增长
    s = append(s, 1)
    
    // 可以一次性添加多个元素
    params := []int{2, 3, 4}
    s = append(s, params...)   // 这里类似于Python中的*符号可变参数传入
    
    // 二维数组&切片的初始化方式
    // 二维数组的初始化
    array := [2][3]int{{1, 2, 3}, {4, 5, 6}}
    for i := range array {
        for j := range array[i] {
            fmt.Printf("%v ", array[i][j])
        }
        fmt.Println()
    }
    
    // 二维切片的初始化
    array := make([][]int, 5)
    
    // 创建二维Slice,Gotour上的范例
    func Create2DArray(dx, dy int) [][]uint8 {
        result := make([][]uint8, dx)
        for i := range result {
            result[i] = make([]uint8, dy)
            for j := range result[i] {
                result[i][j] = uint8((i + j) / 2)
            }
        }
        return result[:]
    }
    
    // 将slice A的内容完全复制到slice B且将A和其原先指向的底层数组切断关系
    a := []int{1, 2, 3}
    b := []int{4, 5}
    b = a[:]
    
    // 完美清空一个slice而不让其与之前指向的内存中数组保持任何关系
    a := []int{1}
    a = nil
    
    PS: 尽量不要用copy方法,可以参见copy方法的原理,总之copy产生的效果是很容易让人困惑的,不适合这种需要完美清空或者完美复制的场景
    

    Golang的map

    Golang的map基本可以说就是哈希表了

    func main() {
            // 初始化map
        m := make(map[string]int)
    
            // 新增键值对
        m["Answer"] = 42
        fmt.Println("The value:", m["Answer"])
            
            // 修改键值对
        m["Answer"] = 48
        fmt.Println("The value:", m["Answer"])
    
            // 删除键值对
        delete(m, "Answer")
        fmt.Println("The value:", m["Answer"])
    
            // 判断键是否存在
        v, ok := m["Answer"]
        fmt.Println("The value:", v, "Present?", ok)
    
        // 需要注意的是下面这种方式声明的map是nil map,如果直接赋予键值对是会报错的,所以通常map的初始化是通过make函数实现的
        var dict map[string]string
    }
    

    Golang中的系统最大值&最小值表示

    maxNum := math.MaxInt32  // 系统32位整型最大值
    minNum := math.MinInt32  // 系统32位整型最小值
    

    Golang中的Channel(通道)初始化

    channel := chan int                  // 单整型通道赋值,一旦传值没有goroutine接收立即报错
    bufferedChannel := make(chan int, 3) // 长度为3的整型通道初始化,只有在传入次数超过3次时才会报错
    

    Golang的类型判断

    // 类型判断
    func main() {
        var i interface{} = "hello"
    
        s := i.(string)
        fmt.Println(s)
    
        s, ok := i.(string)
        fmt.Println(s, ok)
    
        f, ok := i.(float64)
        fmt.Println(f, ok)
    
        f = i.(float64) // 报错(panic)
        fmt.Println(f)
    }
    
    // 类型查询,.(type)只能在switch结构中调用
    func do(i interface{}) {
        switch v := i.(type) {
        case int:
            fmt.Printf("Twice %v is %v\n", v, v*2)
        case string:
            fmt.Printf("%q is %v bytes long\n", v, len(v))
        default:
            fmt.Printf("I don't know about type %T!\n", v)
        }
    }
    

    相关文章

      网友评论

          本文标题:Golang的一些基础语法范式

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