小松的技术博客

六和敬

若今生迷局深陷,射影含沙。便许你来世袖手天下,一幕繁华。 你可愿转身落座,掌间朱砂,共我温酒煮茶。

go语言基础

一、变量
var a:int     //定义int类型的变量a
var a:int = 1 //定义int类型的变量a,并初始化值为1
var a = 1     //通过初始化值自动判断类型
a := 1        //通过初始化值自动判断类型
二、常量
const i = 10000 //定义值为10000的常量i

常量和变量都可以进行分组来同时定义多个:

var(
    i int
    pi float32
    prefix string
)
const(
    i = 100
    pi = 3.1415
    prefix = "Go_"
)

三、基础类型

  • Boolean

    类型为bool,值是true或false,默认为false

    var a:bool = true
    
  • 数值类型

    • int和uint。不同编译器实现,类型长度不同。go也有直接定义位数的类型:int8int16int32(rune)int64uint8(byte)uint16int32int64;
    • float32和float64。自动判断类型时默认float64
    • complex64(32位实数+32位虚数)和complex128(64位实数+64位虚数)。复数形式为RE + IMi
  • 字符串

    类型为string是不可变的,但可以用加号(+)生成另一个字符串。用一对双引号("")或反引号()括起来定义。

  • 错误类型

    • Go内置有一个error类型
    • Go的package里面还专门有一个包errors来处理错误

      err := errors.New("error info")
      
  • iota

    这是go里面一个关键字,它默认开始值是0,每调用一次加1,可以用作枚举:

    const(
        x = iota  // x == 0
        y = iota  // y == 1
        z  // 这里隐式地说w = iota,因此z == 2
    )
    
    
    const v = iota // 每遇到一个const关键字,iota就会重置,此时v == 0
    
  • array

    数组的长度是不可变的

    数组之间的赋值是值的赋值,即当把一个数组作为参数传入函数的时候,传入的其实是该数组的副本,而不是它的指针

    var arr [3]int //声明长度为3的数组([2]int与[3]int长度不同,故类型不同)
    arr = [5]int{1,2,3} // 声明了一个长度为5的int数组,前三个值为1,2,3,后面的值为0
    c := [...]int{4, 5, 6} // 可以省略长度而采用`...`的方式,自动计算长度
    doubleArr := [2][4]int{[4]int{1, 2, 3, 4}, [4]int{5, 6, 7, 8}} //二元数组
    doubleArr := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} //简写的二元数组
    
  • slice

    “动态数组”、引用类型、底层总是指向一个数组

    可以像array一样,只是不需要长度

    var fslice:[]int //声明一个slice
    

    slice可以从一个数组或一个已经存在的slice中再次声明

    arr := [5]byte {'a', 'b', 'c', 'd', 'e'}
    fSlice := arr[1:3]
    

    几个有用的内置函数:

    • len 获取slice的长度
    • cap 获取slice的最大容量
    • append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice
    • copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数

    append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。 但当slice中没有剩余空间(即(cap-len) == 0)时,此时将动态分配新的数组空间。返回的slice数组指针将指向这个空间,而原数组的内容将保持不变;其它引用此数组的slice则不受影响

  • map

    map以键值对的形式存在,是引用类型

    //初始化方式1
    var numbers map[string]int // 声明一个key是字符串,值为int的map
    numbers = make(map[string]int)  //使用make初始化(必须)
    numbers["one"] = 1  //赋值
    //初始化方式2
    numbers := make(map[string]int)  //直接创建
    numbers["one"] = 1  //赋值
    //初始化方式3
    numbers := map[string]int{"one": 1}  //初始化+赋值一体化
    
    
    delete(numbers,"one") //删除item
    

    slice,function 和 包含 slice 的 struct 类型不可以作为 map 的键

四、内存分配(make/new)

make用于内建类型(map、slice 和channel)的内存分配,返回初始化后的(非零)值

new用于各种类型的内存分配,返回指针

具体可以参考:Go 语言中的 new() 和 make() 的区别

原文:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.2.md

←支付宝← →微信 →
comments powered by Disqus