1.go语言的环境变量
Go 开发环境依赖于一些操作系统环境变量,你最好在安装 Go 之间就已经设置好他们。如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go 下。这里列举几个最为重要的环境变量:
$GOROOT
表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方。
$GOARCH
表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm。
$GOOS
表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。
$GOBIN
表示编译器和链接器的安装位置,默认是 $GOROOT/bin
,如果你使用的是 Go 1.0.3 及以后的版本,一般情况下你可以将它的值设置为空,Go 将会使用前面提到的默认值。
$GOPATH
默认采用和 $GOROOT
一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:src、pkg 和 bin,这三个目录分别用于存放源码文件、包文件和可执行文件。
$GOARM
专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。
$GOMAXPROCS
用于设置应用程序可使用的处理器个数与核数。
2.windows环境下安装go语言
注意: 只有package为main的时候,go build才能编译生成可编译文件,如果不是的话,那他只是一个包文件。
2.1、先下载windows下的go语言安装包,msi的。
2.2、配置环境变量,GOPATH是工作目录,下面要有三个空的文件夹,pkg,src,bin。
2.3、 直接安装,然后下载liteide,将这个文件放到go目录文件下。这样才能编译。
ctrl+b是编译,ctrl+f5是运行。
2.4、初始化代码测试。在src下面新建main.go文件。
// You can edit this code!
// Click here and start typing.
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
代码提示,需要安装 go get -u github.com/nsf/gocode
3.代码方面
3.1 引入包
正常
import "fmt" //引入一个
import ( //引入多个
"fmt",
)
import . "fmt" //省略引用,下面调用的时候不用输入包名就能直接使用
import io "fmt" // 别名
3.2 外部是否可以引用
func后面的方法名,首字母如果是小写,则可以表示是private,外面的方法不能引用。如果是大写,则表示public,可以使用
3.3
布尔类型,不能用0,1来表示。只能是true,false。
rune有符号的int32(用于unicode的信息)
byte(uint8的别名)
引用类型:slice(切片), map(hash表),chan(通道,chanel)
go语言中,函数是可以赋值给变量的
var a []int 定义数组
var a [1]int 1表示容量,然后后面的类型来赋零值,如果没有容量参数的话,则会赋值slice类型
math包中有各种类型的最大值最小值,可以判断有没有溢出。
设置type,即别名类型,前面是别名 后面是原类型
type(
文本 string
)
3.4 赋值 声明变量,可以省略后面的类型
如直接 var b
如果省略var关键字的话,直接赋值的话
b:= 456
var b
b=456
var b int
b = 456
var b int = 345
全局变量声明可以用va()进行简写,但是不能省略var
var(
)
函数体内声明多个变量的话
var a,b,c,d int = 1,2,3,4 //依次赋值,输出a=1, b=2, c= 3,d=4, int可以省略
甚至
a,b,c,d := 1,2,3,4
a,_,c,d := 1,2,3,4 //_表示空白符号,可以忽略对2的赋值,真正应用在函数返回值当中,有多个返回值的时候
3.5 类型转换
var a float32 = 1.1
b := int(a) //如果b之前有赋值过类型的话,就不用:了
针对int转字符串的时候要注意
var a int= 65
b := string(a)
这样b展示出来的值是A,是编码。如果想让b为65的字符串的话,需要import一个strconv包
转换的时候,调用里面的转换方法。
var a int= 65
b := strconv.Itoa(a)
a,_ = strconv.Atoi(a)
3.6 常量声明
常量在编译的时候已经确定
关键字const,常量里面的函数是内置函数。
const(
a = 1
b
c
)
//结果a,b,c 都是1
不能复制全局变量,因为还没编译, 函数只能去
iota,这个是计数器,每定义一个变量,就会加一
const(
a = 1
b
c = iota
d
)
//结果a,b 都是1, c = 2 ,d =3
3.7 运算符
<- 专门用于channel的,适用于并发
^这个可以是一元运算符,也可以是二元运算符
1 ^ 2 //二元运算符
^ 2 //一元运算符
<< 二进制左移,
>> 二进制右移,
& 合运算符
| 或
^ 对比的时候两个都是1的时候才是1
6: 0110
11: 1011
& 0010
| 1111
^ 1101
&^0100 (如果下面的数字是1的话,强制将上面的0变成1)
&& 左边函数不成立的话,右边就执行了
||
3.8 指针
Go虽然保留了指针,但与其它编程语言不同的是,在Go当中**不
支持指针运算**以及”->”运算符,而直接采用”.”选择符来操作指针
目标对象的成员
操作符”&”取变量地址,使用”*”通过指针间接访问目标对象
默认值为 nil 而非 NULL
a:=1
var p *int = &a
fmt.Println(*p) //输出值为1
递增递减语句
在Go当中,++ 与 – 是作为语句而并不是作为表达式
就是a++不能作为赋值,只能放在变量的左边的
3.9控制语句
//不需要括号 a是局部变量,只在if语句中可以使用,同名的变量的话,外部的会隐藏,if以内是设置的,等if运行完
//左大括号一定要和if同一行
if a:=1; a>1 {
}
go语言中只有for一种循环语句, 左大括号一定要和if同一行
for {
//相当于没有条件的无限循环,break;跳出
break;
}
//有条件
for a<=3{
}
a := "aaaa";
l := len(a);
for i :=0; i<l; i++ {
}
switch,fallthrough,如果找到匹配的话,还是会继续寻找
switch a := 1; {
case a >= 0:
case a >= 1:
default:
}
跳转语句,goto,break,continue
都需要配合标签
3.10 数组Array
定义数组的格式:var [n],n>=0
- 数组长度也是类型的一部分,
- 因此具有不同长度的数组为不同类型
- 注意区分指向数组的指针和指针数组
- 数组在Go中为值类型
- 数组之间可以使用==或!=进行比较,
- 但不可以使用<或> 可以使用new来创建数组,
- 此方法返回一个指向数组的指针
- Go支持多维数组
赋值的时候,数字不一样会报错
a := [2]int{1,1} //赋值,如果没有的话,都是零值
a := [...]int{1,2,3,4}// 三个点会自动赋值,然后自动生成总数
a:= [2][2]int{
{1,1},
{1,1},
}
3.11切片Slice
- 其本身并不是数组,它指向底层的数组
- 作为变长数组的替代方案,可以关联底层数组的局部或全部
- 为引用类型
- 可以直接创建或从底层数组获取生成
- 使用len()获取元素个数,cap()获取容量
- 一般使用make()创建
- 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
- make([]T, len, cap)
- 其中cap可以省略,则和len的值相同
- len表示存数的元素个数,cap表示容量
var s1 []int
a := [10]int{}
s1:=a[5:10] //包含索引5-9的值,是包含起始,不包含结尾
s1:=a[5:len(a)]
s1:=a[5:] //从索引为5的元素一直到尾部都取光
s1:=a[:5] //取最后五个元素
s1 := make([]int, 3, 10) // 第一个参数是类型,第二个参数初始化元素数量,第三个参数是初始容量,会分配十个初始容量,如果超出10了的话,会重新分配一个长度为20的
cap(s1)//cap表示取出容量
s1 = append(s1,1,2,3)//表示追加
fmt.Printf("%p")
s2 := s2[:]//直接整个赋值
3.12 map
map类型比数组和slice慢100倍
var m map[int]string
m = map[int]string
m = make(map[int]string)//直接加上make函数,传递参数就是map类型
var m map[int]string = make(map[int]string)
m := make(map[int]string) //最简单赋值map的方法
//赋值
m[1] = "ok"
a := m[1]
//删除
delete(m,1)
//复杂的map 每一级的map都需药每一层都make一下
var m map[int]map[int]string
m = make(map[int]map[int]string) //只是对外面这层的map进行了初始化
m[1] = make(map[int]string) //第二级map也需要初始化
m[1][1] = "ok"
a := m[1][1]
a,ok := m[1][1]//多返回值 ok表示是否存在
if !ok {
m[1] = make(map[int]string)
}
3.13 迭代(相当于foreach)
//i表示计数器,slice的,就是key, v表示value,相当于foreach, map的话就是key了
for i,v:= range slice{
}
for k,v:= range map{
}
map的间接排序
排序需要引入sort包
sort.Ints(s)
来进行排序
m:=map[int]string{
1:"a",
2:"a",
3:"a",
4:"a",
5:"a",
}
s := make([]int,len(m))
4.函数
函数function
Go 函数 不支持 嵌套、重载和默认参数
但支持以下特性:
无需声明原型、不定长度变参、多返回值、命名返回值参数
匿名函数、闭包
定义函数使用关键字 func,且左大括号不能另起一行
函数也可以作为一种类型使用
func A(a int, b string) int {
}
func A(a, b string) int {
}
func A() (a,b,int) int {
a,b = 1,2 //使用等号的
return a,b,c
}
//不定长变参
func A(b string, a ...int)int { //其实是slice类型
a,b = 1,2 //使用等号的
return a,b,c
}