zoukankan      html  css  js  c++  java
  • Golang(二)基本概念

    类型

    • 18个基本类型:bool、string、rune、byte、int、uint、int8、uint、int8、int16、uint16、int32、uint32、int64、uint64、float64、complex64、complex128
    • 7个复合类型:array、struct、function、interface、slice、map、channel
    • 其中,slice、map 和 channel 都是引用类型
    • 最后,还有一种无符号的整数类型 uintptr,没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程是才需要,特别是 Go 语言和 C 语言函数库或操作系统接口相交互的地方 

    值传递和引用传递

    • 在golang中函数的参数默认为按值传递,即在函数内部修改传入参数的值是函数外部传入值的深拷贝
    • 如果想要使用引用传递,需要将传入的参数设置为指针类型。如果传入的参数数据很大,建议使用指针类型,减少内存因拷贝参数而占用
    • 本质上指针作为入参也是值传递,go里面其实都是值传递,只是指针一般比原始参数小很多,拷贝代价更低,也方便在不同函数间修改同一个变量

    枚举

    • 在go语言中,没有直接支持枚举的关键字,也就造成go没有直接枚举的功能。但是go提供另一种方法来实现枚举,那就是 const+iota
    // 实现枚举例子
    
    type State int
    
    // iota 初始化后会自动递增
    const (
        Running State = iota // value --> 0
        Stopped              // value --> 1
        Rebooting            // value --> 2
        Terminated           // value --> 3
    )
    
    func (this State) String() string {
        switch this {
        case Running:
            return "Running"
        case Stopped:
            return "Stopped"
        default:
            return "Unknow"
        }
    }
    
    func main() {
        state := Stopped
        fmt.Println("state", state)
    }
    // 输出 state Running
    // 没有重载String函数的情况下则输出 state 0
    View Code

    切片与函数参数

    • 上述已经提过,slice 本身为引用类型,作为参数会将指针的值作为参数以值传递方式传递进函数内部
    • 此时函数内部会产生另一个底层数组相同的切片。修改相应位置的值,函数外的切片对应的值也会随之改变。但是执行 append 操作时因为是两个切片,函数外的 len 值不会改变
    • 不断 append,直到超过 cap 时,底层数组会改变(尺寸变大一倍)。此时修改某一位置的值,函数外的切片不会体现
    • 示例代码如下:
    package main
    
    import "fmt"
    
    func testSliceParams(strs []string, msg string) {
        fmt.Printf("WangAo test: strs----2: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        tmp := strs[0]
        strs[0] = msg
        fmt.Printf("WangAo test: strs----3: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        strs = append(strs, msg)
        fmt.Printf("WangAo test: strs----4: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        strs[0] = tmp
        fmt.Printf("WangAo test: strs----5: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        strs = append(strs, msg)
        fmt.Printf("WangAo test: strs----6: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        strs = append(strs, msg)
        fmt.Printf("WangAo test: strs----7: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        strs = append(strs, msg)
        fmt.Printf("WangAo test: strs----8: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        strs = append(strs, msg)
        fmt.Printf("WangAo test: strs----9: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        tmp = strs[0]
        strs[0] = msg
        fmt.Printf("WangAo test: strs---10: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
    }
    
    func main()  {
        strs := make([]string, 0, 3)
        strs = append(strs, "test1")
        fmt.Printf("WangAo test: strs----1: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
        testSliceParams(strs, "test2")
        fmt.Printf("WangAo test: strs---11: %d %d %p %v
    ", len(strs), cap(strs), &strs, strs)
    
    }
    View Code
  • 相关阅读:
    Markdown常用语法
    课程及资源链接
    cpa-会计
    高管具备的能力
    JDK并发包-copy
    Guava工具类学习-copy
    java开发注解大全-copy
    Codeforces Round #703 (Div. 2)
    [ABC200E] Minflip Summation
    Codeforces Round #720 (Div. 2)
  • 原文地址:https://www.cnblogs.com/wangao1236/p/10898950.html
Copyright © 2011-2022 走看看