Go学习完结
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go学习完结相关的知识,希望对你有一定的参考价值。
文章目录
Go学习完结
- Google开源
- 编译型语言
- 21世纪的语言(2007)
0.HelloWord
创建一个名为:hello.go
的文件,这里.go 是go类型的文件的后缀。
package main
import "fmt"
func main(){
fmt.Printf("Hello World!");
}
然后打开cmd进入该文件的目录下:输入go bulid hello.go
windows下会在该目录下生成一个名为:hello.exe
的文件。
我们再在cmd下输入hello
即可看到打印信息。
特点
语法简洁,开发效率高,执行性能好。
使用
使用Go的fmt格式化工具,在GoLand下的设置:
Settings->File Watchers -> 添加go fmt
即可。
学习
1.声明与赋值、变量与常量
Go语言声明的变量必须使用,变量声明用var。
var name string //单独声明
var age int
var isOk bool
//批量声明
var(
name string
age int
isOk bool
)
const mo string = "1234"
cosnt m = "12345"
const(
c1 = 1
c2 = 1.5
c3 = "abc"
)
var name string = "herio" //声明同时赋值
var name = "herio" //自动推导类型
name := "herio" //简短变量声明,只能在函数中使用
Go 有众所周知的类型如 int,这个类型根据你的硬件决定适当的长度。意味着在 32 位硬件上,是 32 位的;在 64 位硬件上是 64 位的。注意:int 是 32 或 64 位之一,不会定义成其他值。uint 情况相同。
如果你希望明确其长度,你可以使用 int32 或者 uint32。完整的整数类型列表(符号和无符号)是 int8 , int16 , int32 , int64 和 byte , uint8 , uint16 , uint32 ,uint64 。byte 是 uint8 的别名。浮点类型的值有 float32 和 float64 (没有 float 类型)。64 位的整数和浮点数 总是 64 位的,即便是在 32 位的架构上。
2.输出
Println换行打印,Printf 格式化输出,Print不换行打印。
3.常量计数器iota
package main
import "fmt"
const (
a1 = iota //常量计数器
a2
a3
a4
)
func main() {
fmt.Print(a1)
fmt.Print(a2)
fmt.Print(a3)
fmt.Print(a4)
}
//0123
//辨析
const(
a1 = iota //0
a2 = _ //1
a3 = iota //2
a4 //3
)
const(
a1,a2= iota ,iota+1 // 0 ,1
a3,a4= iota+2, iota+3 // 3,4
)
const (
a = iota //0
b // 1
c // 2
)
4.数据类型
输出变量可以用%v
,打印类型可以用%T
。
打印多行字符串可以用反引号 ` 输出,反引号的字符串是原义输出,不会转义。
在 Go 中字符串是不可变的。
复数
s := 5 + 4i
fmt.Printf("%T %v\\n", s, s)
fmt.Print(s)
/*
complex128 (5+4i)
(5+4i)
*/
运算符
虽然 Go 不支持运算符重载(或者方法重载),而一些内建运算符却 支持 重载。例如 +
可以用于整数、浮点数、复数和字符串(字符串相加表示串联它们)。
关键字
5.if与for循环、switch、goto
与C类似就是C去掉括号,for range 就是类似for each。
continue与break 与C类似。
Flag:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j > 5 {
break Flag
}
fmt.Printf("j=%d\\n", j)
}
}
fmt.Println("over")
/*
j=0
j=1
j=2
j=3
j=4
j=5
over
*/
package main
import "fmt"
func main() {
a := 10
if a > 10 {
fmt.Println("a>10")
} else {
fmt.Println("a<=10")
}
for i := 0; i < 10; i++ {
fmt.Println(i)
}
s := "Herio my boy"
for i, c := range s {
fmt.Printf("%d : %c\\n", i, c)
}
}
/*
a<=10
0
1
2
3
4
5
6
7
8
9
0 : H
1 : e
2 : r
3 : i
4 : o
5 :
6 : m
7 : y
8 :
9 : b
10 : o
11 : y
*/
switch 和goto与C类似
package main
import "fmt"
func main() {
var num1 int = 100
switch num1 {
case 98, 99:
fmt.Println("It's equal to 98")
case 100:
fmt.Println("It's equal to 100")
default:
fmt.Println("It's not equal to 98 or 100")
}
}
6.数组和切片
package main
import "fmt"
func main() {
a := [...]int{1, 1, 4, 5, 1, 4}
fmt.Println(a)
fmt.Printf("%T\\n", a)
var b [3][2]int
b = [3][2]int{
{1, 2},
{3, 4},
{5, 6},
}
fmt.Println(b)
}
/*
[1 1 4 5 1 4]
[6]int
[[1 2] [3 4] [5 6]]
*/
用 make() 创建一个切片
当相关数组还没有定义时,我们可以使用 make() 函数来创建一个切片 同时创建好相关数组:var slice1 []type = make([]type, len)
。
也可以简写为 slice1 := make([]type, len)
,这里 len
是数组的长度并且也是 slice
的初始长度。
所以定义 s2 := make([]int, 10)
,那么 cap(s2) == len(s2) == 10
。
make 接受 2 个参数:元素的类型以及切片的元素个数。
如果你想创建一个 slice1,它不占用整个数组,而只是占用以 len 为个数个项,那么只要:slice1 := make([]type, len, cap)
。
make 的使用方式是:func make([]T, len, cap)
,其中 cap 是可选参数。
所以下面两种方法可以生成相同的切片:
make([]int, 50, 100)
new([100]int)[0:50]
声明一个map
mp := make(map[string]int)
mp["herio"] = 123
fmt.Printf("%d\\n", mp["herio"])
val, ok := mp["herio"]
fmt.Print(val, ok)
/*
123
123 true
*/
7.指针
package main
import "fmt"
func main() {
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
fmt.Printf("a 变量的地址是: %x\\n", &a )
/* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的指针地址: %x\\n", ip )
/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\\n", *ip )
}
a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20
Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
查看以下实例:
package main
import "fmt"
func main() {
var ptr *int
fmt.Printf("ptr 的值为 : %x\\n", ptr )
}
ptr 的值为 : 0
函数
延迟代码
函数作为值
恐慌Panic和恢复(Recover)
三、包
cmd下查看go的环境配置env:
go env
C:\\Program Files\\Go\\src
这里存放了所有的包。
自定义包:even.go
package even
func Even(i int) bool {
return i % 2 == 0
}
func odd(i int)bool {
return i % 2 == 1
}
这里大写开头的函数才能导出。
在C:\\Program Files\\Go\\src
目录下创建一个名为even的文件夹,然后将该文件放入到该目录下。
然后就可以导入该包使用了。
package main
import (
"even"
"fmt"
)
func main() {
a := 10
fmt.Printf("%d : %v", a, even.Even(a))
}
/*
10 : true
*/
包的文档
一些常见的包
- fmt 实现格式化I/O函数
- io 包含原始的I/O操作界面
- bufio 实现缓冲的I/O
- sort 排序
- strconv 字符串与基本数据的转换
- os 提供了与平台无关的操作系统功能接口
- sync 基本同步原语
- flag 命令行解析
四、内存分配
务必记得 make 仅适用于 map,slice 和 channel,并且返回的不是指针。应当用 new 获 得特定的指针。
五、自定义类型
注意首字母大写的字段可以被导出,也就是说,在其他包中可以进行读写。字段名以 小写字母开头是当前包的私有的。包的函数定义是类似的,参阅第 3 章了解更多细节。
六、接口,并发、通讯
待学
参考内容
电子书 https://www.bookstack.cn/read/the-way-to-go_ZH_CN/eBook-07.2.md
视频https://www.bilibili.com/video/BV16E411H7og?p=28
Go中文网:https://studygolang.com/pkgdoc
李文周的博客:https://www.liwenzhou.com/
以上是关于Go学习完结的主要内容,如果未能解决你的问题,请参考以下文章
萌萌家网课代理8马哥高端Go语言百万并发高薪班/微服务/分布式高可用/Go高并发超推荐大佬棒牛 90完结
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础
解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段