这是我参与「第六届青训营 」伴学笔记创作活动的第 1 天
- 简介:go语言是Google出品的一门通用型计算机编程语言,特点:高性能,高并发,语法简单(类似于c语言),学习曲线平缓,有完善的工具链和丰富的标准库,支持静态链接,快速编译,跨平台(交叉编译)和垃圾回收。
- 入门:
开发环境:需要安装golang,之后配置集成开发环境:vsc或者goland,前者需要在vsc内安装go插件和依赖项而后者较为方便(在jetbrains网站中下载goland购买或者体验30天),另外如果你是学生那么可以用学校的教育邮箱来注册可以获得为期一年的使用权。
1.基础语法:
hello word
package main
import(
"fmt"
)
funcmain(){
fmt.PrintIn("helloworld")
}
第一行main包 (程序的入口包)第三行导入标准库里面的fmt包 (IO输入/输出字符串和格式化字符串) ,7行main函数中调用了fmt.println() 2.变量: 类型:整型,浮点型,布尔型,字符串(内置类型可以直接用+拼接) go语言变量名由字母、数字、下划线组成,其中首个字符不能为数字 声明:使用var关键字(常量将var改成const) ,变量名:=。
package main
var x, y int
var ( // 这种因式分解关键字的写法一般用于声明全局变量
a int
b bool
)
var c, d int = 1, 2
var e, f = 123, "hello"
//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"
func main(){
g, h := 123, "hello"
println(x, y, a, b, c, d, e, f, g, h)
}
3.条件语句: 与c语言中不同为if后面没有(),{ }直接跟在if后面, if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。 switch 语句 switch 语句用于基于不同条件执行不同动作。 特别的go语言中默认不用加break(这与c语言中是不同的) 4.循环 Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号。 和 C 语言的 for 一样:
for init; condition; post { }
特别的go中的循环和c不同的是没有while和for循环的区分如下例子:
package main
import "fmt"
func main() {
sum := 0
for i := 0; i <= 10; i++ {
sum += i
}
fmt.Println(sum)
}
5.数组 数组与c语言类似但初始化和声明却有所不同
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
长度不确定时
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
6.切片 可变长度的数组,用make创建,可以用append增加长度 用copy可以拷贝两个切片的数据。
var slice1 []type = make([]type, len)或
slice1 := make([]type, len)
append
func main() {
var numbers []int
printSlice(numbers)
/* 允许追加空切片 */
numbers = append(numbers, 0)
printSlice(numbers)
/* 向切片添加一个元素 */
numbers = append(numbers, 1)
printSlice(numbers)
copy(注意创建更大容量的切片)
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
7.Map 遍历时是无顺序的
package main
import "fmt"
func main() {
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap [ "France" ] = "巴黎"
countryCapitalMap [ "Italy" ] = "罗马"
countryCapitalMap [ "Japan" ] = "东京"
countryCapitalMap [ "India" ] = "新德里"
8.range 用于遍历 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
8.函数 指针 下面这个函数想要将变量值加2但是是无效的
func add2(n int){
n += 2
需要借助指针
func add2ptr(n *int){
*n += 2
9.结构体和结构体方法 ①声明结构体
type user struct {
name string
password string
}
初始化
a := user{name: "wang", password: "1024"}
fmt.Printf("%+v\n", a) // {name:wang password:1024}
使用.来访问结构体成员
fmt.Println(a.name) // wang
fmt.Println(a.password) // 1024
②结构体方法 结构体方法和普通函数的语法是非常类似的,唯一不同的是,结构体的方法在函数名前有一个接收者,意味着这个方法是由指定接收者接收的。go语言当中没有this指针的概念,而是由接收者来代替this。
package main
import "fmt"
type user struct{
name string
password string
}
func(u user) checkPassword(password string) bool {
return u.password ==password
}
func main(){
a:=user{name:"wang",password:"1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048"))
}
带指针可以对结构体进行修改, 想要改变结构体内容时就需要使用指针接收者. 10.错误处理 需要导入errors包
import (
"errors"
)
调用Sqrt的时候传递的一个负数,然后就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输 错误,请看下面调用的示例代码
result, err:= Sqrt(-1)
if err != nil {
fmt.Println(err)
}
另外声明并调用函数
func findUser(users []user,name string)(v *user,err error){
for_,u := range users{
if u.name == name{
return &u,nil
}
}
return nil,errors.New("not found")
}
func main(){
u,err := findUser([]user{{"wang","1024"}},"wang")
if err != nil{
fmt.Println(err)
return
}
fmt.Println(u.name) //wang
if u,err := finderUser([]user{{"wang","1024"}},"li");err != nil{
fmt.Println(err) //not found
return
}else{
fmt.Println(u.name)
}
}
- go实战
通过三个项目带领学习了 Go 语言语法及其标准库使用:一个经典的猜数字游戏,给定一个随机数,让用户猜测这个数并给出与这个数相比是大了还是小了;一个在线词典,通过 HTTP 爬虫爬取其他在线词典网站的结果并返回;一个 SOCKS5 代理,实现了 SOCKS 5 的握手流程。