127-Golang复习(一)

 

 

 

 

Go语言
Golang


特点
1.Google开源

2.编译型语言
这里就要说一下编译型语言和解释型语言的区别

解释型语言的源代码不是直接翻译成机器语言,而是先翻译成中间代码,然后再由解释器对中间代码进行解释运行
比如Python,Java等

编译型语言
直接把源代码编译成二进制的可执行文件,然后就交给处理器
比如C,Go

 

 

 

计算机语言的发展
简单说一下一些语言的诞生年代
C    1972年
C++    1979年
Python    1991年
Java    1995年
Ruby    1995年
PHP    1995年
JavaScript    1995年
Go    2007年

 

 

 

配置GOPATH
gopath就是go的项目的路径,也就是工作目录
所有的项目都放在gopath的src目录下面

 

 

 


编译
go build就可以把项目代码编译成可执行文件
在windows就是exe文件

-o指定名字
go build -o hello

 

 


跨平台编译
比如现在是在windows上编译,那么出来的是exe的windows的程序
那么如果要编译出linux系统下的可执行文件
就可以设置
set GOOS=linux
set GOARCH=amd64

在其他系统内也是一样的道理,先设置好想要的系统,然后再进行编译

 

 

 

 


语句的位置
Java的所有语句都是在Class的函数下面
Go的所有语句都是在函数里面
Python就可以直接写语句
js也可以直接写语句

 

 

 

关键字
go中有25个关键字
break    default    func    interface    select
case    defer    go    map    struct
chan    else    goto    package    switch
const    fth(缩写)    if    range    type
continue    for    import    return    var

还有37个保留字
Constants:    true,false,iota,nil
Types:    int,int8,int16,int32,int64
    uint,uint8,uint16,uint32,uint64,uintptr
    float32,float64,complex128,complex64
    bool,byte,rune,string,error

Functions:  make,len,cap,new,append,copy,close,delete
    complex,real,imag
    panic,recover

这里有一个比较有意思的点就是 保留字是可以被设置成变量名的,比如
true:="123"

但是呢,不要用这些保留字作为变量名
以后如果某些保留字被更新成关键字,那么程序就不兼容了

 

 

 


变量
比如现在内存是这样的
00000001  000000002 00000003
然后如果分成字节的话,依次下来内存地址为
0x01,0x02,0x03

然后在栈内存中保存变量,比如a,b,c
然后a指向0x01,
b指向0x02,
c指向0x03

 

 

 


声明变量
var abc

var是什么意思,就是variable变量

那么直接var abc是不行的
因为没有给他类型

这里就有一个概念了,叫静态语言和动态语言
像go,java就是静态语言,比如给出类型

像python,php,js就是动态语言,不用给类型


所以声明要这样
var name string
var age uint
var ok bool

也可以批量声明
var(
  name string
  age uint
)

另外,如果变量声明了,但是没有使用
那么就会编译失败

 

 

 


print打印
Print
Printf
Println
%s占位符,替换打印
fmt.Printf("name:%s",name)

 

 

 

类型推导
var name string="abc"
这种情况可以直接写成
var name="abc"
因为根据后面的值直接可以推导出是什么类型
就不用写类型了


快速变量声明(简短变量声明)
name:="abc"
这个只能在函数里面用
不能在函数外面用

所以函数外面只能是
var name="abc"

 

 

 

 

匿名变量
直接用_下划线来表示
x,_:=function()
_,y:=function()

 

 

 


批量常量
const(
  n1=100
  n2
  n3=200
  n4
)

全局的变量和常量,声明了没用也没关系

 

 

 

 

iota
常量计数器

const(
  n1=iota
  n2
  n3
)

n1是0,n2是1,n3是2

 

 

 

 


整型
int8    -128到127
int16    -32768到32767
int32    -2^31到2^31-1
int64    -2^63到2^63-1

uint8    0到255
uint16    0到65535
uint32    0到2^32-1
uint64    0到2^64-1


uint    32位系统是uint32,64位系统是uint64
int    32,64
uintptr    无符号整型,存放一个指针

 

 

 

 

八进制,十六进制
var a int =10
var b int =077
var c int =0xb

fmt.Printf()
%d    十进制
%o    八进制
%x    十六进制
%b    二进制

 

 

 


浮点数
float32,float64

我们可以看一下浮点数最大是多少
可以打开go的math包下面的const包
/math/const

// Floating-point limit values.
// Max is the largest finite value representable by the type.
// SmallestNonzero is the smallest positive, non-zero value representable by the type.
const (
    MaxFloat32             = 3.40282346638528859811704183484516925440e+38  // 2**127 * (2**24 - 1) / 2**23
    SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23)

    MaxFloat64             = 1.797693134862315708145274237317043567981e+308 // 2**1023 * (2**53 - 1) / 2**52
    SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)
)


我们可以看到这一段
就是float32和float64的范围

 

 

 

 


浮点数赋值
默认的话就是float64
f1:=1.23
f2:=float32(f1)

然后互相的话是不能赋值的

 

 

 

 

复数(用的很少)
complex64,,complex128
实部和虚部32,实部和虚部64

 

 

 

布尔值bool
go语言中不允许将整型转成bool
bool无法参与数值运算,也无法与其他类型转换

 

 

 

字符串
字符串只能用双引号""
字符才是单引号''

 

字符
英文数字都是1个字节
utf8的汉字一般是3-4个字节

这里有一个非常关键的点

s:= "一二三四五"
fmt.Println(len(s))
这里输出的是15
因为len方法实际上返回的是字节长度
中文字符在utf8编码中是3-4个字节
所以这里的长度len是15

如果想要字符的长度,那么
s:= "一二三四五"
fmt.Println(len(s))
fmt.Println(utf8.RuneCountInString(s))

这里输出的是5
这个事情其实是非常非常关键的

 

 


byte和rune
byte实际上是uint8类型,代表了ascii码的一个字符
rune是一个utf-8字符
rune实际上是int32

byte是uint8,所以只能是0-255
'a','1'和‘一’都是rune类型,都是int32

 


 

 

for循环的几种格式

第一种,基本格式
for i:=0;i<10;i++{
}

第二种,
var i=5
for ;i<10;i++{
}

第三种
var i=5
for i<10{
  i++
}

第四种 range
s:="Hello"
for k,v := range s{

}

 

 

 


fallthrough
在switch当中
如果满足了a,然后fallthrough
会执行下一个case

 

 

 

 

跳出外层for循环

    for i := 0; i < 5; i++ {
        for j := 0; j < 5; j++ {
            if i == 2 {
                break
            }
            fmt.Printf("%d === %d \n", i, j)
        }
    }


在这个例子中,我们用break
但是只是跳出了内层循环
那么如果我们想要跳出外层循环
可以用flag,也可以用goto


func main() {

    for i := 0; i < 5; i++ {
        for j := 0; j < 5; j++ {
            if i == 2 {
                goto end
            }
            fmt.Printf("%d === %d \n", i, j)
        }
    }

end:
    end()
}

func end() {
    fmt.Println("end")
}


这里的end是label标签
label标签定义了没有使用的话也会报错的
所以定义了label也要使用

 

 


或者我们可以直接把for循环加一个label
然后直接break这个label

myloop:
    for i := 0; i < 5; i++ {
        for j := 0; j < 5; j++ {
            if i == 2 {
                break myloop
            }
            fmt.Printf("%d === %d \n", i, j)
        }
    }

 

 

 

 

 


运算符
1.算术运算符
2.关系运算符
3.逻辑运算符
4.位运算符
5.赋值运算符

1.算术
+,-,*,/,%


2.关系
==
!=
>=
<=

3.逻辑
&&
||
!
与或非

4.位运算符
&    按位与,2个1才是1
|    按位或,2个0才是0
^    异或,不一样就是1
<<    左移,x*2^n    8<<1=16
>>    右移,x/2^n    16>>1=8


5.赋值运算符
+=
-=
等等

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(127-Golang复习(一))