码迷,mamicode.com
首页 > 其他好文 > 详细

Golang(二)基本概念

时间:2019-05-21 13:14:38      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:strong   cli   hid   cep   main   使用   str   设置   stopped   

类型

  • 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\n", len(strs), cap(strs), &strs, strs)
    tmp := strs[0]
    strs[0] = msg
    fmt.Printf("WangAo test: strs----3: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----4: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs[0] = tmp
    fmt.Printf("WangAo test: strs----5: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----6: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----7: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----8: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----9: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)
    tmp = strs[0]
    strs[0] = msg
    fmt.Printf("WangAo test: strs---10: %d %d %p %v\n", 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\n", len(strs), cap(strs), &strs, strs)
    testSliceParams(strs, "test2")
    fmt.Printf("WangAo test: strs---11: %d %d %p %v\n", len(strs), cap(strs), &strs, strs)

}
View Code

Golang(二)基本概念

标签:strong   cli   hid   cep   main   使用   str   设置   stopped   

原文地址:https://www.cnblogs.com/wangao1236/p/10898950.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!