Go语言入门学习 | 青训营笔记

82 阅读4分钟
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

Go语言简介

概述

Go语言是由Google推出,原生支持多线程的一门现代编程语言,为高性能Web开发提供解决方案。

Go语言特点

原生支持多线程,因此是一门可以轻松实现高性能,高并发的语言。

作为一门现代语言,Go吸收了前人经验,拥有丰富的标准库和完整的工具链。

与C/C++相比,Go语言的语法简单,易上手。

Go的编译迅速,它是静态编译为一个独立的二进制可执行文件,并且可以交叉编译,具有跨平台的特性。

Go语言有垃圾回收机制,无需开发者手动释放内存,但也因此其性能与C/C++相比较弱。

Go入门开发

配置开发环境

从官网下载Go语言安装包,安装后使用VSCode或者Goland。

Goland基本上无需多余配置,安装后即可使用,下面讲一下Windows下VSCode的配置。

首先是插件的安装,搜索Go拓展,安装第一个即可。

extension.png

后续是配置Go语言环境,首先检查系统的环境变量

设置GOPATH

gopath.png

Go语言编译器目录添加到系统变量的PATH

go.png

随后打开cmd,依次输入下面两条命令

go env -w GO111MODULE=on
go env -w GOPROXY=goproxy.cn

回到VSCode,即可安装Go的各种工具了。

Go语言语法

声明变量

//var 变量名 类型
var a int
var b string = "hello"//可以赋初值

//var 变量1,变量2 类型 = 值1,值2
var c, d float = 1.1,2.2

//变量名 := 初值,根据初值自动推断类型
e := 1 //int类型
f := "hello" //string类型

声明常量

与声明变量类似,把var改为const即可,注意 := 不能用于声明常量。

条件分支if语句

与C系列语言类似,但去掉了布尔表达式的括号。

a:=1
if a > 0 {
    fmt.Println("Positive")
} else if a < 0 {
    fmt.Println("Negtive") 
} else {
    fmt.Println("Zero")
}

循环

Go语言的循环只有for循环,没有while,但for同时做到了其它语言while的功能。

//无限循环
for {
    fmt.Println(".")
}

//类似其它语言的for
for i:=0;i<100;i++ {
    fmt.Println(i)
}

//类似其它语言的while
i:=100
for i>=0 {
    fmt.Println(i)
    i--
}

switch语句

Go语言的switch与C/C++不同,它无需在每个case结束后加上break,不会自动执行下面的case语句。 同时case的条件也可以很灵活,因此switch语句可以看作if语句的另一种形式

a := 2
switch a {
case 1:
    fmt.Println("1")
case 2,3:
    fmt.Println("2 or 3")
default:
    fmt.Println("other")
}

switch {
case a > 0:
    fmt.Println("Positive")
case a < 0:
    fmt.Println("Negtive")
default:
    fmt.Println("Zero")
}

其它常用数据类型

数组

var a[5] = int{1,2,3,4,5}

切片

可变长度数组

a := make([]int,5)

map

哈希表

m := make(map[string]int) //字符串为键,整形为值

使用 range 遍历容器

a := []int{1, 2, 3, 4}
for i, n := range a {
   fmt.Println("Index:", i, "element:", n)
}

函数

func add(a int, b int) int {
   return a + b
}
func add(a, b int) int {
   return a + b
}
//多返回值
func add_sub(a int, b int) (int, int) {
   return a + b,a - b
}

指针

作用类似于C/C++,但是用法简单得多,可以用来修改传入函数的参数的值。

a := 1
a_ptr := &a //取a的地址

//用指针可以实现交换两个变量值的函数
func swap(a *int, b *int) {
   c := *b
   *b = *a
   *a = c
}

结构体和方法

Go语言的结构体实现了其他语言的功能,结构体方法则实现了成员函数即方法的功能,Go语言就是这样实现面向对象的。

//定义结构体
type MyStruct struct {
   a int
   b string
}

//打印结构体成员的方法
func (s MyStruct) print {
   fmt.Println(a, b)
}
//修改结构体成员的方法
func (s *MyStruct) set(a int,b string){
   s.a = a
   s.b = b
}

s := MyStruct{1, "hello"} //创建结构体变量
s.print() //调用打印方法
s.set(2, "bye") //调用修改方法
s.print() //打印修改结果

其他

课程后面讲的错误处理,字符串处理个人认为可以在项目制作过程中慢慢学习熟练,故不再提及。

项目实战

项目实战个人遇到了几点问题,分享出来希望对大家有帮助。

Windows下从命令行输入

在猜数字程序里,我从命令行输入整数总会导致Atoi函数返回错误,即输入的字符串不是整数,经过搜索引擎搜索,发现是Windows输入会在字符串末尾附加一个\r',则新增一行删去末尾'\r'的函数


input = strings.TrimSuffix(input, "\n")
input = strings.TrimSuffix(input, "\r")//这行加上就可以正常运行了

在线词典

要找到合适的翻译网址,HTTP请求简单的,比较容易实现。