本篇文章为go语言基础语法与常用特性解析的青训营笔记
go的安装与配置参考资料:
一,下载与安装go
-
选择中文网的包安装,Windows用户下载的是
msi安装包。 -
GOROOT:自定义安装目录,例如我的是:C:\Program Files\Go,这个目录是我安装Go语言的目录。 -
GOPATH:准备一个工作区域,以后写代码用,例如我的是:D:\go。- 在这个工作目录中,新建三个目录:
bin、pkg、src
- 在这个工作目录中,新建三个目录:
-
环境变量配置:
- 在Windows中的系统变量中分别添加
GOROOT和GOPATH
- 在Windows中的系统变量中分别添加
-
测试:
- 打开命令控制工具 输入
go version
- 打开命令控制工具 输入
解释:
在进行Go语言开发的时候,我们的代码总是会保存在$GOPATH/src目录下(也就是我们指定的工作目录)。在工程经过go build、go install或go get等指令后,会将下载的第三方包源代码文件放在$GOPATH/src目录下,产生的二进制可执行文件放在 $GOPATH/bin目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下
二,使用与常用基础语法
1.go mod init test01 初始化模块名为test01
2.go mod tidy 添加缺失模块与删除多余模块
3.go run . 编译并运行当前go文件
For example
hello world.
package main --包名
import "fmt" --模块名
func main() {
fmt.Printf("hello world!") //打印出hello world!
}
//go run [path] 直接运行程序
//go build [path] 将程序编译成二进制,会变成一个exe文件,通过.[path]执行该程序
类型
package main
func main() {
// 变量声明的方式,以整型为例子
var intNum1 int = 0
var intNum2, intNum3 int = 1, 2
var intNum4 = 3
// 类型自动推断
intNum5 := 5
println(intNum1)
println(intNum2, intNum3)
println(intNum4)
println(intNum5)
// 常量
const PI float32 = 3.1415926
println(PI)
// 布尔
flag := false
println(flag)
// 浮点型64
var float64Num float64
println(float64Num)
// 浮点型32
float32Num := float32(float64Num)
println(float32Num)
// 字符串
str := "123"
str += "654"
println(str)
}
/**
Go是一门强类型的语言
*/
if -- else
package main
func main() {
// if - else
if 7%2 == 0 {
// 偶数
println("7 is even")
} else {
// 奇数
println("7 is odd")
}
// if - else if - else
// num给其一个初始条件 9
if num := 9; num < 0 { // 如果 num < 0
println(num, "is negative") // 输出它是一个负数
} else if num == 0 {
println(num, "is zero") // 输出它是一个0
} else {
println(num, "is positive") // 输出它是一个正数
}
}
循环
package main
func main() {
// 死循环=while(true)
for {
println(1)
break
}
// 打印0-9
for i := 0; i < 10; i++ {
println(i)
}
}
/**
go没有while,没有do while,只有for循环
*/
switch
package main
import "time"
func main() {
a := 2
switch a {
case 1:
println("one")
case 2:
println("two")
default:
println("不知道")
}
t := time.Now()
println(t)
// 特殊用法,可以取代if - else
switch {
case t.Hour() < 12:
println("早于中午")
default:
println("晚于中午")
}
}
/**
switch自带一个break
*/
slice (go 特有的)
package main
import "fmt"
func main() {
// 用make创建切片,需要指定初始长度
s := make([]string , 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("the s[1] is :",s[1])
// 新增,需要用一个切片变量接收,容量不够会扩容,返回一个新的slice
sNew := append(s,"d")
fmt.Println("the length of sNew is :",len(sNew))
// copy
a := make([]string, len(sNew))
copy(a, sNew)
fmt.Println(a)
// 切片操作
fmt.Println(sNew[:])
fmt.Println(sNew)
fmt.Println(sNew[0:4])
// 简易定义
good := []string{"g", "o", "o", "d"}
fmt.Println(good)
good = append(good, "!")
fmt.Println(good)
// 区别数组: b := [5]int{1, 2, 3, 4, 5},是需要指定长度的
}
/**
切片是一个可变长数组,不用指定其长度。[]类型
*/
map
package main
import "fmt"
func main() {
// key string, value int
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m)
fmt.Println(len(m)) //2
fmt.Println(m["one"]) //1
fmt.Println(m["two"]) //2
fmt.Println(m["three"]) //0
// ok 获取map中是否有这个key存在
r, ok := m["three"]
//fmt.Println(r)
//fmt.Println(ok)
fmt.Println(r, ok)
// 删除key为one
delete (m,"one")
// 简易定义
good :=map[string]int{"one":1,"two":2,"three":3}
for g,v := range good{
fmt.Println(g,v)
}
// 遍历map,同理可以遍历数组
// for key, value := range m {
// println(key, value) // key,value
// }
}
/**
map 是无序的
*/
func
package main
func main() {
c :=map[string]int{"one":1,"two":2}
println(add(1, 2))
println(exists(c, "two"))
}
// 函数名add,参数a,b均为int,返回值为int
func add(a int, b int) int {
return a + b
}
// 支持多值返回
func exists(m map[string]int,key string) (int,bool) {
val ,ok := m[key]
return val,ok
}
exception
package main
import (
"errors"
"fmt"
)
func main() {
fmt.Println(isequals("hello","hello"))
value,err := isequals("hello","world")
if err != nil {
fmt.Println(err)
}else {
fmt.Println("isequals:",value)
}
}
func isequals(name ,input string) (bool,error) {
if name == input {
return true ,nil
}else {
return false ,errors.New("not equals")
}
}
json处理
package main
import (
"encoding/json"
"fmt"
)
func main() {
user := User{Name: "Mengcheng", Age: 20}
fmt.Println(user) //{Mengcheng 20}
// 转json
res, err := json.Marshal(user)
fmt.Println(res) //
fmt.Println(string(res)) //
fmt.Println(err)
// 反序列化
user2 := User{}
json.Unmarshal(res, &user2)// 传指针 传引用 传地址
fmt.Println(user2) //{Mengcheng 20}
}
// 1 要求结构体的变量首字母为大写
type User struct {
Name string `json:"name"` // 当转json时指定key的名称
Age int `json:"age"`
}
总结
文章的详细总结:
一、Go的安装与配置
- 下载与安装:Windows用户下载
msi安装包进行安装。 - GOROOT:自定义安装目录,如
C:\Program Files\Go。 - GOPATH:工作区域,如
D:\go,包含bin、pkg、src三个目录。 - 环境变量配置:在Windows系统中添加
GOROOT和GOPATH变量。 - 测试:通过命令
go version验证安装是否成功。
二、Go的使用与常用基础语法
- 模块初始化:使用
go mod init [module-name]初始化模块。 - 模块整理:使用
go mod tidy添加缺失模块和删除多余模块。 - 运行Go文件:使用
go run .编译并运行当前目录下的Go文件。
基础语法
- Hello World:展示了如何编写和运行一个简单的Go程序。
- 类型:介绍了变量声明、类型自动推断、常量、布尔值、浮点型和字符串。
- 条件语句:展示了
if和if-else语句的使用。 - 循环:介绍了
for循环的使用,Go语言中没有while和do-while循环。 - Switch语句:展示了
switch语句的使用,它自带break。 - Slice(切片) :介绍了切片的创建、追加、复制和操作。
- Map:介绍了Map的创建、访问、删除和遍历。
- 函数:展示了如何定义和使用函数,包括多值返回。
- 异常处理:介绍了如何使用
errors包进行错误处理。 - JSON处理:介绍了如何使用
encoding/json包进行JSON的序列化和反序列化。
结尾
这篇青训营笔记为初学者提供了Go语言的基础知识和一些实用的编程技巧。通过学习这些内容,读者可以掌握Go语言的基本语法和一些高级特性,为进一步深入学习Go语言打下坚实的基础。希望这篇教程能够帮助你快速上手Go语言,并在实际项目中应用这些知识。