Harley Wang

为了心中的美好,不妥协直到变老

Technical discuss & life Note-taking.


Golang学习笔记

一. =:= 有什么区别?

  • = 是赋值, := 是声明变量并赋值。
  • = 使用必须使用先 var 声明
  • := 是声明并赋值,并且系统自动推断类型,不需要 var 关键字

注意: := 只能在函数内部使用

二. 在Atom中安装 Go-Plus Package,常用快捷键:

  • control + option + g: 跳转到声明函数

三. const 用于定义常量,iota是一个比较特殊的关键字,从0开始计数,下一次常量出现时自动加1;下次用 const 重新定义常量时则重置为0

const (
	Sunday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

四. 如果你引入了一个包,但没有使用它,是没法编译通过的,例如:

imported and not used: "math"

五. 函数,函数以func关键字定义,例如:

func add(x int, y int) int {
    return x + y
}

func swap(x, y string) (string, string) {
    return y, x
}

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

func main() {
    fmt.Println(add(42, 13))
    a, b := swap("hello", "world")
    fmt.Println(a, b)
    fmt.Println(split(17))
}

参数的类型声明是放在变量名后面的。
如果参数类型一样,除了最后一个要声明类型,之前的都可以省略。
返回值的类型放在 ){ 之间,如果没有返回值,则为空。
可以返回多个值,这时候返回的类型要用 () 包含起来。
返回值可以被命名,return 直接返回。
函数 main 为主函数,一个项目里只有一个。

六. range函数是个神奇而有趣的内置函数,它来遍历数组,切片和字典。

  • 当用于遍历数组和切片的时候,range函数返回索引和元素;
  • 当用于遍历字典的时候,range函数返回字典的键和值。
package main

import "fmt"

func main() {

    // 这里我们使用range来计算一个切片的所有元素和
    // 这种方法对数组也适用
    nums := []int{2, 3, 4}
    sum := 0
    for _, num := range nums {
        sum += num
    }
    fmt.Println("sum:", sum)

    // range 用来遍历数组和切片的时候返回索引和元素值
    // 如果我们不要关心索引可以使用一个下划线(_)来忽略这个返回值
    // 当然我们有的时候也需要这个索引
    for i, num := range nums {
        if num == 3 {
            fmt.Println("index:", i)
        }
    }

    // 使用range来遍历字典的时候,返回键值对。
    kvs := map[string]string{"a": "apple", "b": "banana"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }

    // range函数用来遍历字符串时,返回Unicode代码点。
    // 第一个返回值是每个字符的起始字节的索引,第二个是字符代码点,
    // 因为Go的字符串是由字节组成的,多个字节组成一个rune类型字符。
    for i, c := range "go" {
        fmt.Println(i, c)
    }
}

输出结果为

sum: 9
index: 1
a -> apple
b -> banana
0 103
1 111

七. 获取安装一个包

go get gopkg.in/mgo.v2/bso

八. defer

  • 作为异常处理和文件关闭的处理函数。
  • 匿名函数和命名函数都可以作为defer的延迟函数。
  • 多个defer语句之间的顺序是先进后出的。
  • defer语句可以有返回值,但是这个返回值是没有意义的。
  • 匿名函数的操作对象如果会被返回,则该defer是会对返回值有影响的。

九. 导出名字, 在 Go 中,任何以大写字母开头的变量名、函数名都是被导出的名字(exported name)。只有被导出的名字才能被其它包访问。

十. 如何导入一个相对目录下的包的方法,自己摸索的,例如:/Users/haley/Documents/gin/template 就是项目所在的目录,需要在这个目录下创建一个 src 目录,然后把包文件存在 src 目录下,设置以下环境变量就可以正常访问了

vi ~/.bash_profile

# 添加以下语句
export GOPATH=$GOPATH:/Users/haley/Documents/gin/template
最近的文章

梦见未来 MacBook 的新功能

昨天上午在公司参加一个分享会,中途手机突然没电了,晚上做梦梦见未来的MacBook具有无线充电的功能,赶紧做个图出来,大概是这个样子的:MacBook 的左下角有一个无线充电的Logo,手机放在上面就可以无线充电了,充电过程中状态栏会有一个无线充电的图标,点击会提示目前充电电量和充满所需的时间。例如:继续睡…zzZzZZzz…

继续阅读
更早的文章

gin中文文档

安装与配置 框架架构 生命周期 Context 路由 基本路由 路由参数 路由群组 控制器 请求 请求头 Cookies 上传文件 响应 响应头 附加Cookie 字符串响应 JSON响应 视图响应 文件下载 重定向 同步异步 视图 ...…

继续阅读