go 基础

go 基础,第1张

1、go关键字
    break(和c一样用于退出循环)
    default(当 select 中的其他条件分支都没有准备好的时候,`default` 分支会被执行。)
    func(声明函数)
    interface(声明接口)
    select
    select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信 *** 作,要么是发送要么是接收。
    select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。

    case(用于switch、select中指定特定的分支)
    defer(用于执行异常处理代码,类似c++的析构但不完全一样)
    go(用于启动协程)           
    map(声明map)
    struct(声明结构体)
    chan(声明管道,用于协程通信)         
    else(条件语句else)
    goto(用于代码跳转)         
    package(用于声明包)
    switch(用于条件选择)
    const(声明常量)        
    fallthrough(Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。)
    if(条件语句if)
    range(用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。)
    type(用于声明结构体、类型别名)
    continue(用于循环,跳过单次循环)
    for(用于循环)
    import(用于导入包)
    return (函数返回)
    var(声明变量)

2、go变量命名

1)首字符可以是任意的Unicode字符或者下划线
2)剩余字符可以是Unicode字符、下划线、数字
3)字符长度不限

3、go保留字
    Constants:    true  false  iota(声明枚举,自动+1)  nil(空指针)

    Types:    int  int8  int16  int32  int64  
              uint  uint8  uint16  uint32  uint64  uintptr(无符号)
              float32  float64  complex128  complex64(复数)
              bool  byte  rune(类似char)  string  error(异常)

    Functions:   
      make(初始化内存)  
      len(获取数组、切片、map的长度)
      cap(获取数组、切片、map的容量)  
      new(表达式new(T)将创建一个T类型的匿名变量,所做的是为T类型的新值分配并清零一块内存空间,
      然后将这块内存空间的地址作为结果返回,而这个结果就是指向这个新的T类型值的指针值,
      返回的指针类型为*T。)
      append(append用来将元素添加到切片末尾并返回结果。)
      copy(copy(s1, s2),函数 copy 在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 指向同⼀底层数组。直接对应位置覆盖。)  
      close(close函数是一个内建函数, 用来关闭channel,这个方法应该只由发送者调用, 而不是接收者。)            
      delete(delete(map, key) 函数用于删除集合的某个元素,参数为 map 和其对应的 key。删除函数不返回任何值。)
      complex(声明复数var name complex128 = complex(x, y))
      real(获取复数的实部real(x))  
      imag(获取复数的虚部imag(x))  
      panic(用于抛出异常,这里的机制和java不同)
      recover(recover 仅在延迟函数 defer 中有效,用于捕获异常,这里的机制和java不同)

go的引用类型:

    slice   -- 切片
    map     -- 映射
    chan    -- 管道

go的“_”是特殊标识符,用来忽略结果。

4、go的基础函数

init函数:

init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等

每个包可以拥有多个init函数

包的每个源文件也可以拥有多个init函数

同一个包中多个init函数的执行顺序

对同一个go文件的init()调用顺序是从上到下的。

对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()函数。

对于不同的package,如果不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init(),如果package存在依赖,则先调用最早被依赖的package中的init(),最后调用main函数。
比如a依赖b、c,b依赖d、e,c依赖f、g,那么init执行顺序是:d、e、b、f、g、c、a(树的后序遍历)

不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序

init函数不能被其他函数调用,而是在main函数执行之前,自动被调用

定义时不能有任何的参数和返回值,且Go程序自动调用。

main 函数
main包下的main函数是包的执行入口,只能定义一个
定义时不能有任何的参数和返回值,且Go程序自动调用。

func main(){
    //函数体
}

5、go的命令

go env用于打印Go语言的环境信息。

go run命令可以编译并运行命令源码文件。

go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。

go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包。

go install用于编译并安装指定的代码包及它们的依赖包。

go clean命令会删除掉执行其它命令时产生的一些文件和目录。

go doc命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。

go test命令用于对Go语言编写的程序进行测试。

go list命令的作用是列出指定的代码包的信息。

go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。

go vet是一个用于检查Go语言源码中静态错误的简单工具。

go tool pprof命令来交互式的访问概要文件的内容。

6、go的运算符

注意: ++(自增)和–(自减)在Go语言中是单独的语句,并不是运算符。

+	相加
-	相减
*	相乘
/	相除
%	求余
==	检查两个值是否相等,如果相等返回 true 否则返回 false。
!=	检查两个值是否不相等,如果不相等返回 true 否则返回 false。
>	检查左边值是否大于右边值,如果是返回 true 否则返回 false。
>=	检查左边值是否大于等于右边值,如果是返回 true 否则返回 false。
<	检查左边值是否小于右边值,如果是返回 true 否则返回 false。
<=	检查左边值是否小于等于右边值,如果是返回 true 否则返回 false。
&&	逻辑 AND 运算符。 如果两边的操作数都是 true,则为 true,否则为 false。
||	逻辑 OR 运算符。 如果两边的操作数有一个 true,则为 true,否则为 false。
!	逻辑 NOT 运算符。 如果条件为 true,则为 false,否则为 true。
&	参与运算的两数各对应的二进位相与。(两位均为1才为1)
|	参与运算的两数各对应的二进位相或。(两位有一个为1就为1)
^	参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。(两位不一样则为1)
<<	左移n位就是乘以2的n次方。“a<>	右移n位就是除以2的n次方。“a>>b”是把a的各二进位全部右移b位。
=	简单的赋值运算符,将一个表达式的值赋给一个左值
+=	相加后再赋值
-=	相减后再赋值
*=	相乘后再赋值
/=	相除后再赋值
%=	求余后再赋值
<<=	左移后赋值
>>=	右移后赋值
&=	按位与后赋值
l=	按位或后赋值
^=	按位异或后赋值
7、go的变量

声明变量(会自动初始化,每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil。)

变量名首字母大写,可以被其他包访问调用(公有),变量名首字母小写,其他包不能访问和调用(私有)

在同一个域里一个变量只能定义一次,不可重复定义

var 变量名 变量类型

可用声明多个

var (
        a string
        b int
        c bool
        d float32
    )
// 或者
var name, sex = "www.hengyumo.cn", 1

在函数内部,可以使用更简略的 := 方式声明并初始化变量,会自动进行类型推导。

func main() {
    n := 10
    m := 200
    fmt.Println(m, n)
}

匿名变量(不会占用命名空间,不分配内存):

_, y := foo()

常量

    const pi = 3.1415
    const e = 2.7182

const同时声明多个常量时,如果省略了值则表示和上面一行的值相同。

const (
        n1 = 100
        n2
        n3
    )

itoa
iota是go语言的常量计数器,只能在常量的表达式中使用。 iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。

 const (
            n1 = iota //0
            n2        //1
            n3        //2
            n4        //3
        )
const (
            n1 = iota //0
            n2        //1
            _
            n4        //3
        )
const (
            n1 = iota //0
            n2 = 100  //100
            n3 = iota //2
            n4        //3
        )
const n5 = iota //0

const (
            _  = iota
            KB = 1 << (10 * iota)
            MB = 1 << (10 * iota)
            GB = 1 << (10 * iota)
            TB = 1 << (10 * iota)
            PB = 1 << (10 * iota)
        )
const (
            a, b = iota + 1, iota + 2 //1,2
            c, d                      //2,3
            e, f                      //3,4
        )

基本类型

类型	     长度(字节) 默认值 说明
bool	        1	  false	
byte	        1	  0	  uint8
rune	        4	  0	  Unicode Code Point, int32
int, uint	4或8	  0	32 或 64 位
int8, uint8	1	  0	-128 ~ 127, 0 ~ 255,byte是uint8 的别名
int16, uint16	2	  0	-32768 ~ 32767, 0 ~ 65535
int32, uint32	4	  0	-21亿~ 21亿, 0 ~ 42亿,rune是int32 的别名
int64, uint64	8	  0	
float32	         4	0.0	
float64	        8	0.0	
complex64         8		
complex128       16		
uintptr	        4或8		以存储指针的 uint32 或 uint64 整数
array			值类型
struct			值类型
string           ""	UTF-8 字符串
slice                   nil	引用类型
map                      nil	引用类型
channel		        nil	引用类型
interface	          nil	接口
function	            nil	函数

uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。

float32 的浮点数的最大范围约为3.4e38,可以使用常量定义:math.MaxFloat32。 float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。

支持八进制、 六进制,以及科学记数法。标准库 math 定义了各数字类型取值范围。

 a, b, c, d := 071, 0x1F, 1e9, math.MinInt16

空指针值 nil,而非C/C++ NULL。

8、字符串

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符

多行字符串:

s1 := `第一行
    第二行
    第三行
    `

常用字符串函数

len(str)	求长度
+或fmt.Sprintf	拼接字符串
strings.Split	分割
strings.Contains	判断是否包含
strings.HasPrefix,strings.HasSuffix	前缀/后缀判断
strings.Index(),strings.LastIndex()	子串出现的位置
strings.Join(a[]string, sep string)	join *** 作

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

字符

uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。rune类型,代表一个 UTF-8字符。
// byte
        for i := 0; i < len(s); i++ { 
            fmt.Printf("%v(%c) ", s[i], s[i])
        }
        fmt.Println()
//自动处理unicode为rune
        for _, r := range s { 
            fmt.Printf("%v(%c) ", r, r)
        }
        fmt.Println()
9、类型转换

Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。

强制类型转换的基本语法如下:

T(表达式)

阅读更多go相关文章,您可以访问我的个人网站:www.hengyumo.cn

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存