Go语言入门-《Go语言实战》学习笔记

学习资料

安装

环境变量配置

  • 在/etc/profile文件中添加
export PATH=$PATH:/usr/local/go/bin
  • 执行命令立即生效
source /etc/profile
  • 输入命令查看配置是否成功
go

安装DELVE

1. 安装Homebrew,执行命令

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. 安装成功后,执行

brew install go-delve/delve/delve

Visual Studio Code插件安装

设置代理

首选项-设置

http.proxy

需要安装的插件,会自动在右下角弹出提示,具体插件如下

Installing 9 tools at /Users/mac/go/bin
  gocode
  gopkgs
  go-outline
  go-symbols
  guru
  gorename
  godef
  goreturns
  golint

开发工具

终端设置代理

$ export http_proxy=http://proxyAddress:port

$ export ALL_PROXY=socks5://127.0.0.1:1080 

原文:让终端走代理的几种方法

Go语言简介

第3章打包和工具链

3.1包

  • 同一个目录下的所有.go文件必须声明同一个包名

3.1.2 main包

  • 在Go语言里,命名为main的包具有特殊的含义。Go语言的编译程序会试图把这种名字的包编译为二进制可执行文件。main()函数是程序的入口,程序编译时,会使用声明main包的代码所在的目录的目录名作为二进制可执行文件的文件名。
  • 使用“远程导入”时,请确保您的网络畅通无阻。
import (
   // 远程导入
    "github.com/goinaction/code/chapter2/sample/search"
)

3.2.2 命名导入

  • 导入的多个包具有相同的名字,可以使用命名导入:在import语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。
package main

import (
   "fmt"
   myfmt "mylib/fmt"
)
  • 当你导入了一个不在代码里使用的包时,Go编译器会编译失败,并输出一个错误。目的是避免代码变的臃肿。
  • 有时,用户可能需要导入一个包,但是不需要引用这个包的标识符。在这种情况,可以使用空白标识符_来重命名这个导入。

空标识符

下划线字符(_)在Go语言有很多用法。用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不兴趣的值。

3.3 函数init

  • 每个包可以包含任意多个init函数,会在main函数之前执行。
func init() {
    // 执行操作
}

3.4 使用Go的工具

  • 使用命令执行编译和清理工作
go build
go clean

3.5.1 go vet

  • 检测代码的常见错误

3.7.2 对gb的介绍

  • 依赖管理
  • gb工程会区分开发人员写的代码和开发人员需要依赖的代码。
  • gb工程与Go官方工具链(包括go get)并不兼容。因为gb不需要设置GOPATH,而Go工具链无法理解gb工程的目录结构。

第4章 数组、切片和映射

数组

  • 由于数组占用的内存是连续分配的,CPU能把正在使用的数据缓存更久的时间。

声明和初始化

  • 在Go语言中声明变量时,总和使用对应类型的零值来对变量进行初始化。
// 声明一个包含5个元素的整型数组
var array [5]int

// 声明一个包含5个元素的整型数组
// 用具体值初始化每个元素
array := [5]int{10, 20, 30, 40, 50}
  • 如果使用…代替数组的长度,Go语言会根据初始化时数组元素的数量来确定该数组的长度。
// 声明一个整型数组
// 用具体值初始化每个元素
// 容量由初始化值的数量决定
array := [...] int{10, 20, 30, 40, 50}

// 声明一个有5个元素的数组
// 用具体值初始化索引为1和2的元素
// 其余元素保持零值
array := [5]int{1: 10, 2: 20}

切片

  • 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。

创建和初始化

1. 使用make函数创建切片,需要传入一个参数,指定切片的长度。
  • 如果只指定长度,那么切片的容量和长度相等。也可以分别指定长度和容量。
// 创建一个字符串切片
// 其长度和容量都是5个元素
slice := make([] string, 5)
  • 分别指定长度和容量时,创建的切片,底层数组的长度是指定的容量,但是初始化后并不能访问所有的数组元素。
// 创建一个整型切片
// 期长度为3个元素,容量为5个元素
slice := make([] int, 3, 5)
2. 使用切片字面量创建切片,这种方法和创建数组类似,只是不需要指定[]运算符里的值。初始的长度和容量会基于初始化时提供的元素的个数确定。
// 创建字符串切片
// 期长度和容量都是5个元素
slice := [] string {"Red", "Blue", "Green", "Yellow", "Pink"}
  • 可以设置初始长度和容量:在初始化时给出所需的长度和容量作为索引。
// 创建字符串切片
// 使用空字符串初始化第100个元素
slice := [] string{99: ""}
  • 如果在[]运算符里指定了一个值,那么创建的就是数组而不是切片。

映射

  • Map数据结构

第5章 Go语言的类型系统

定义类型的方法

使用struct关键字

// user在程序里定义一个用户类型
type user struct{
    name        string
    email       string
    ext         int
    privileged  bool
}

// 声明user类型的变量,并初始化所有字段
lisa := admin{
    name:       "Lisa", 
    email:      "[email protected]",
    ext:        123,
    privileged: true,
}

// 也可以这样
// 声明user类型的变量
lisa := user{"Lisa", "[email protected]", 123, true}

零值

  • 数值型:0
  • 字符串:空字符串
  • 布尔类型:false

第6章 并发

并发与并行的概念

  • 并发(concurrency)不是并行(parallelism)。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。

goroutine

  • 一个线程可以创建多个goroutine

锁住共享资源

  1. 原子函数
  2. 互斥锁
  3. 通道

第7章 并发模式

  • runner
  • pool
  • work
发布了182 篇原创文章 · 获赞 42 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/wyyl1/article/details/81288434