Go语言编程笔记

1.第1章 初识Go语言

  1. 介绍了好多工具,我这里使用sublime text3 + window的go1.4进行学习。
    需要安装gosublime插件,都很简单,不再赘述.

2. 第二章 顺序编程

  1. 多重赋值可以交换变量的值 的 i,j = j,i
  2. Go语言的预定义常量: ture , false 和iota 。
    const (
    c0 = iota //0
    c1 //1
    c2 //2

3.go里的数组只能传值,不能传值。 数组切片(slice)能实现动态数组和传址,它特别像一个指向数组的指针, 当然他有自己的数据结构。

  • 基于数组创建slice:
    var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    //基于 myArray 的所有元素创建数组切片:
    mySlice = myArray[:]
    //基于 myArray 的前5个元素创建数组切片:
    mySlice = myArray[:5]
    //基于从第5个元素开始的所有元素创建数组切片:
    mySlice = myArray[5:]

  • 直接创建(使用make)
    //创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间:
    mySlice2 := make([]int, 5, 10)

  • slice数组的遍历和正常的数组遍历一样
    for i, v := range mySlice{
    fmt.Printfln("mySlice[", i, "] = ", v)
    }

  • 增加数组的元素
    fmt.Println("len(mySlice):", len(mySlice)) //计算mySlice数组切片中当前所存储的元素个数
    fmt.Println("cap(mySlice):", cap(mySlice)) //计算mySlice数组切片分配的空间大小
    mySlice = append(mySlice, 1, 2, 3) //追加三个元素
    mySlice = append(mySlice, mySlice2...) //打散追加mySlice2的元素,注意...不可以去掉

    copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
    copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置

  1. map语句
    package main
    import "fmt"
    // PersonInfo是一个包含个人详细信息的类型
    type PersonInfo struct {
    ID string
    Name string
    Address string
    }
    func main() {
    var personDB map[string] PersonInfo
    personDB = make(map[string] PersonInfo)
    // 往这个map里插入几条数据
    personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203,..."}
    personDB["1"] = PersonInfo{"1", "Jack", "Room 101,..."}
    // 从这个map查找键为"1234"的信息
    person, ok := personDB["1234"]
    // ok是一个返回的bool型,返回true表示找到了对应的数据
    if ok {
    fmt.Println("Found person", person.Name, "with ID 1234.")
    } else {
    fmt.Println("Did not find person with ID 1234.")
    }
    }

  2. 变参函数的语法糖
    func Printf(format string, args ...interface{}) {
    // ...
    }
    形如 ...type 格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。它是一个语法糖(syntactic sugar) ,即这种语法对语言的功能并没有影响,但是更方便程序员使用。
    如果没有语法糖,将这么写:
    func myfunc2(args []int) {
    for _, arg := range args {
    fmt.Println(arg)
    }
    则调用方比如构造一个数组切片来处理: myfunc2([]int{1, 3, 7, 13})

  3. 触发错误处理panic和recover的处理
    defer func(){
    if r: = recover(); r != nil{
    log.Printf("Runtime error caught: %v", r)
    }
    }()

    foo()
    

    无论foo()是否触发了错误处理流程,该匿名defer函数

你可能感兴趣的:(Go语言编程笔记)