为什么选择golang ?
Go 性能比 C 和 C++更好 :
Go优势: 数据处理能力 和 高并发能力
C 和 Go 之父: 肯—汤普森
学习go 语言 要遵守规矩哦 eg :
//规矩就是规矩 : go缩紧采用行尾风格
for i:=0; i<10; i++{
fmt.println("hello world");
}
Go程序的执行原理
1 命令源码文件 : 声明在一个包中,存在一个main 函数,往往单独放在一个包中的
2 库源码文件 : 比如依赖的别的模块 ,别的包等 都称为库源码文件, 执行时会生成.a为回后缀的归档文件
3 测试源码文件: 名称以 _test.go为后缀的源码文件, 必须包含 Test或者 Benchmark名称为前缀函数
go的 常用 命令
go run: 专门运行命令源码文件的命令(main函数)!! 不是用来运行所有文件的!!
生成 两种文件 .a为后缀的归档文件 和 可执行文件
go build 主要用于测试编译,在编译过程中,若有必要,会同时编译与之相关联的包。
go build 和 go install都做了什么?
go build
对于命令源码文件, 编译 链接 将产生的可执行文件挪动到当前文件夹
go install : 用于 编译代码包或者源码文件
对于含有main函数的命令源码文件, 1 生成结果文件。2将结果文件移动到环境下 (命令源码文件: 就是带主函数的源码文件 )
go install 分两方面:
1 库源码文件 : 生成 .a为后缀的归档文件 ,并将最终结果放在到pkg目录下
2 带命令的源码文件, 编译-链接 生成.exe文件 最终结果存放在bin目录下
go get 命令 : 用于从远程代码仓库上 下载 并安装代码包 go get命令会把远程代码 下载到$GOPATH 下第一个工作区的src目录中,并安装。
1 git clone 2 compile 3 link 生成归档文件 ,4 将归档文件存在 .pkg目录下
go test 读取测试文件 并生成可执行文件
go doc 是一个很强大的文档工具
集成开发 IDE 选择 jetbrains 激活码:http://idea.iblue.me
package main
import "fmt"
func main(){
fmt.Println("hello world")
}
编码规范 :
1 区分大小写
2 大小字母开头表示包外可见,小写字母开头表示仅包内可见
3 包名尽量和文件名一致,文件命名小写+下划线
4 结构体命名 驼峰法,首字母大小写看外部是否需要调用
缩进 : command + alt +L
linux 下 go fmt 指令格式化 go 文件
包的导入规范: 三种类型:
1 标准库的包 2 程序内部的包 3第三方包 按顺序导入
变量
var 关键字来定义
var name type
name = value
package main
import "fmt"
func main(){
var a int
a = 30
fmt.Printf("a is: %d\n",a)
fmt.Println("hello world")
}
go、C/C++ 语言是强类型的语言 ,像python 等都是弱类型
package main
import "fmt"
func main(){
var a int
a = 30
fmt.Printf("a is: %d\n",a)
var str = "王二"
//%T 类型推断
fmt.Printf("类型是: %T, 数值是%s\n",str,str);
fmt.Println("hello world")
}
package main
import "fmt"
func main(){
var a int
a = 30
fmt.Printf("a is: %d\n",a)
var str = "王二"
fmt.Printf("类型是: %T, 数值是%s\n",str,str)
fmt.Println("hello world")
var m, n int = 1,2
fmt.Println(m,n)
var (
name = "zhangsan"
age = 18
gender = "man"
)
fmt.Printf("name =%s, age = %d, gender =%s",name, age, gender)
}
第一种: var name type = value
第二种 : 类型推导 var name = value
第三种简短声明: name := value
简短定义左边至少有一个是新值, 简短定义不能定义全局变量
变量的零值(默认值) int : 0 float: 0.0 string: “”
go 语言 变量/包定义了就必须使用,否则就会报错
常量
常量关键字 const (运行过程中,值不能改变)
常量的语法: 1 显式类型 2 隐式类型
例如 const PATH = “www.baidu.com”
const PI = 3.14
常量定义了可以不使用,不会报错。
iota 可修改的常量
**如果不赋值 ,默认和上一行一样 ,不论用不用 ,iota都 会进行自增**
package main
import "fmt"
func main() {
const (
a = iota //0 iota 0
b = iota //1 iota 1
c //2 iota 2
d //3 iota 3
e = 100 //100 iota 4
f //100 iota 5
g = "haha" //haha iota 6
h = iota //7 iota 7
i //8 iota = 8
)
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
fmt.Println(g)
fmt.Println(h)
fmt.Println(i)
}
数据类型 :
bool %t
int8 —int 64
uint8 --uint64
byte ->uint8
rune -> uint32
复合类型(派生类型)
1 指针类型
2 数组类型
3 结构化类型
4 Channel类型
5 函数类型
6 切片类型
7 接口类型
8 Map 类型
上图可知 ‘A’为 int32 类型 对应数字 65(ASCII下标)
‘中文’也是 int32
数值转换 :
go语言是一种静态语言,数值定义、赋值需要类型兼容, 常数在有需要时会自动转型, 变量需要手动转型。
但转换一定得是有一定关系的转换,
可以是 int32 -> int8 float64 -->int64
但不能是 bool -> int8
算术运算苻
包括: + - * / % ++ –
go 语言中 ++ – 不能参与运算 , 例如 a = b++ + --c 不支持;
位运算符 (&^位清空)
& | ! ^ >> <<
&^ : 位清空 : a = (a &^b) 对于b 这个数的二进制位, 如果二进制位为0 结果对应位就取a二进制对应位的值, 如果b的二进制位为1 ,那么结果相应位为0
a : 1100 1100
b : 0010 0011
ret : 1100 1100
程序流程结构:
顺序执行
分支语句
if 、 switch 、 select
循环结构 for 、goto
go语言不存在 while do while
if 语法格式:
一: 正常写法:
if 布尔表达式{
//case A;code
}else{
//case B ;code
}
二:包含一个可选的语句组件,在条件执行判断之前执行
if statement; condition{
}
eg:
if a:=4; a>0{
fmt.Println('haha')
}// 这个num这能在 if模块内使用 , if模块结束, num立马销毁
switch (fallthrouth贯穿)
1 go语言 case 可以不含 break; 执行完一个分支之后switch 就结束, 也可以含有 break, 强制结束switch 语句
2 switch 省略后边变量, 则默认为布尔true
**3 fallthrough 用在case 中表示 贯穿执行下一个case 分支(类似于C++中 没写break), 但是 fallthrough 不能放在最后一个case中 **
switch{
case true:
fmt.Println("true")
case false:
fmt.Println("false")
}
m := 40
switch {
case m > 40:
fmt.Println('a')
case m > 30:
fmt.Println('A')
case m > 20:
fmt.Println('B')
}
上图可知:Println 打印字符结果为 ASCII码值
for
go语言 只有一个for 循环,没有 while 、do while
//1
for i:=1; i<5; i++{
fmt.Println("haha")
}
//2 类似while
i:=1
for i<5 {
fmt.Println("hello")
i++
}
//3 while(true)
for{
fmt.Println("hahah")
}
生成随机数:类似于python
数组的 初步使用 array
数组创建方式一:
var arr[4] int
len(arr) // 数组中实际存储的元素数量
cap(arr) //数组的容量
由于数组含有默认值 ,所以 cap(arr) == len(arr)
数组的创建方式二:
var b = [4] int{}// 这样写 定时 必须初始化
数组创建方式三:
var c = [4] int{1:1, 3:2}
数组的 创建方式四: 根据初始化元素的具体个数确定数组的长度
f := […] int {1,2,3,4,5,6,7}
f := […] int {1:2, 6:7}