吉祥物:金花鼠
官网:: golang.org
云计算应用:CDN(内容分发网络),访问网址加载视频速度很快
go语言特点:机能达到静态语言的安全和性能(c语言),也达到动态语言的开发维护效率(python)
go语言包的概念:每个文件都属于一个包,main函数必须在main包
go语言引入垃圾回收机制:内存自动回收,不需要开发人员关注
go语言天然并发:goroutine,轻量级线程
go语言开发工具:VSCode,sublime,vim,Emacs
SDK:软件开发工具包 下载地址:golong.org
验证SDK安装成功:
运行方式:
- go build main.go编译后生成main.exe,然后直接输入main.exe执行,可以指定编译文件的名字go build -o mymain.exe main.go
- go run main.go 直接运行
go注意事项:如果go定义的变量,import的包没用到不会编译通过
go注释方式:行注释//,块注释/* */ 快捷键 Ctrl+/
go缩进:tab整体向右移动,shift+tab整体向左移动
格式化:> gofmt main.go会在控制台显示格式化后的代码,
> gofmt -w main.go 将格式化后的内容在重置到原文件
go每行最长80字符,println代码里换行"," 若想在控制台输出换行用\n
Dos命令
我们在控制台输入指令发给dos服务器,服务器在Windows里执行相应操作
查看当前目录:dir
回到根目录:cd \
创建目录:md project1 project2
删除空目录:rd project1
删除多级目录:rd /q/s project1 (/q:带询问)
创建文件:echo hello world > abc.txt
复制文件(使用原文件名):copy abc.txt d:\tmp
复制文件(重新命名):copy abc.txt d:\tmp\hello.txt
移动文件:move abc.txt f:\tmp
删除文件:del abc.txt
清屏:cls
退出:exit
go变量
- var i int 先定义不赋值,默认值为0
- var num = 10.5 根据值自动判定类型
- str := "tom" 不用var定义,但需要用:=,等价于var name string name = “tom”
- var n1,n2,n3 int 支持同时定义多个
- var a,b,c = 100, "tom",300 支持同时赋值多个变量
全局变量:在函数之外定义的变量
var (
a = 100
b = "necy"
c = 300
)
go数据类型
- 数值型:int,int32,int64 (rune是int32的别名,代表字符的Unicode编码)
- 浮点型:float32,float64
- 布尔型:bool
- 字符串型:string,rune,byte(byte操作的对象是字节切片,与string的不可变不同,byte是可变的)
go数据类型转换
1. string到int
int, _ = strconv.Atoi(string)
2. string到int64
int64, _ = strconv.ParseInt(string, 10, 64) 转换后10进制,转换后int64
3. int到string
string = strconv.Itoa(int)
string = fmt.Sprintf("%d", num) 第一个参数的类型根据第二个参数类型而定
4. int64到string
string = strconv.FormatInt(int64,10) 10进制
5. 如果string="hello",转换后的标准数据类型是0/false
6.以原生字符串的形式输出(反引号)
go指针
- 基本数据类型,变量存的就是值,也叫值类型
- 获取变量的地址用&,比如 var num int num的地址:&num
- 指针类型,指针变量存的是地址,var ptr *int = &num
ptr输出:0xc04204e080
&ptr输出:0xc04206c020
*ptr输出:10
值类型:int系列,float系列,bool,string,数组,struct
引用类型:指针,slice切片,map,管道,interface
Tips
- 变量名,包名,函数名建议使用驼峰法,getName(), setName()
- 引入其他包,从src的下一级开始
- 变量名首字母大写代表可以被其他的包引用,首字母小写代表不可以被其他的包引用
算术运算
- 如果运算的都是整数,不管return的接收类型得到的结果也是整数
- i++或i-- 只能独立使用, a = i ++不可以,必须分成2句,i++,a = i
- ++i或--i 在go中没有
- &&当第一个条件为false,放弃判断第二个
- || 当第一个条件为true,放弃判断第二个
go获取键盘输入
- 导入fmt包
- fmt.scanf("%s %d", &name, &age)
- fmt.scanln(&name)
- 后台通过name拿到前台输入的值
go分支结构
- 可以在if分支先定义再判断
- switch后面的值key可以是常量,变量,表达式,有返回值的函数
- 如果key和a都是变量,那数据类型必须保持一致
- case后面可以加多个常量或表达式case key == 20:
switch穿透,会继续向下执行一个case,但只能穿透一层
- for循环的2种实现
for i := 1; i < 10; i++ {
fmt.Println("123")
}
i:=1
for i < 10 {
fmt.Println("123")
i++
}
- for循环遍历字符串
name = "amber"
for index,val := range name {
fmt.Println("index=%d, value=%c", index, val)
}
- do while实现循环
var i:= 1
for{
fmt.Println("hello world!")
i++
if i > 10 {
break
}
}
- 使用for-range来遍历,即使有中文也可以
- 随机数rand要设置一个种子,否则得到的值永远是固定的
import(
"fmt"
"math/rand"
)
fmt main{
rand.Seed(time.Now())
n := rand.Intn(100)
fmt.Println(n)
}
- break可以通过标签跳出到指定位置,默认跳出最近的for循环
fmt.main(){
label1:
for i = 0; i < 4; i++ {
label2:
for j = 0; j < 5; j++ {
if j==2{
break label1
}
}
fmt.Println("j=", j)
}
}
* break label1是跳出第一个for循环
goto使用
直接跳到label指定的内容,不推荐使用
fmt main {
var num = 10
if n > 10 {
goto label1
}
fmt.Println("ok1")
fmt.Println("ok2")
fmt.Println("ok3")
label1:
fmt.Println("ok4")
fmt.Println("ok5")
}
go函数
定义:为完成特定功能的集合
fun 函数名(形参)(返回值类型){
return 返回值列表
}
fun cal(n1 float64, n2 float64, operator byte) float64 {
var res float64
switch operator {
case '+':
res = n1 + n2
case '-':
res = n1 - n2
default:
fmt.Println("操作符错误")
}
return res
}
-
init函数
如果一个文件同时包含全局变量,init函数,main函数,执行的顺序是: 全局变量 > init函数 > main函数
-
匿名函数 :在定义时直接调用
- 全局匿名函数
go引入包
- 被引入的包的函数或变量首字母必须大写(大写认为是公有,小写是私有)
defer函数
输出的结果:
string常用命令