go语言学习备注

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

  1. 其本身并不是数组,它指向底层的数组
  2. 作为变长数组的替代方案,可以关联底层数组的局部或全部
  3. 为引用类型
  4. 可以直接创建或从底层数组获取生成
  5. 使用len()获取元素个数,cap()获取容量
  6. 一般使用make()创建
  7. 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
  8. make([]T, len, cap)
  9. 其中cap可以省略,则和len的值相同
  10. 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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值