go语言语法自我总结
- GOPATH: 就是 golang 工作目录:我们的所有项目的源码都这个目录下。
- 浮点数=符号位+指数位+尾数位
- Golang 中没有专门的字符类型,如果要存储单个 字符(字母),一般使用 byte 来保存。
- 对于传统的字符串是由字符组成的,而 Go 的字符串不同,它是由 字节组成的。
- Go 语 言 的 字 符 使 用 UTF-8 编 码
- 可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出该数字对应的 unicode 字符
- 字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
- 字符串的表示方式,可以使用反引号。 那么久会以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
- 如果变量名、函数名、常量名首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用 ( 注:可以简单的理解成, 首字母大写是公开的, 首字母小写是私有的)
- Golang 的自增自减只能当做一个独立语言使用,a = a++是不正确的。并且没有前置++和前置 --。
- go原因的switch语言,匹配项后面也不需要再加 break。case 后的表达式可以有多个,使用 逗号间隔
- case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致
- case 后面可以带多个表达式,使用逗号间隔。
- case 后面的表达式如果是常量值(字面量),则要求不能重复
- 如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case,也叫 switch 穿透
- 循环语句for 可以是只有循环判断条件,或者可以什么都没有,需要break才可以退出循环
- break 语句出现在多层嵌套的语句块中时,可以 通过标签指明要终止的是哪一层语句块
- continue 语句用于 结束本次循环,继续执行下一次循环,可以通过标签指明要跳过的是哪一层循环。
- 如果包名较长,Go 支持给包取别名, 注意细节:取别名后,原来的包名就不能使用了
- 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
- Go 函数不支持函数重载
- 在 Go 中, 函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以实现对函数调用
- 函数既然是一种数据类型,因此在 Go 中,函数可以作为形参,并且调用
- Go 支持自定义数据类型。例如:type MyInt int
- 如果一个函数的形参列表中有可变参数,则可变参数需要放在形参列表最后。
- go语言文件执行的流程:全局变量定义 -> init函数 -> main 函数。如果main包引用了别的包,那么就先执行别的包中的全局变量定义、init函数,在执行main包中的。
- 匿名函数没有名字。可以赋给一个变量,那这个变量就是函数变量。如果赋给全局变量,就变成了全局匿名函数。
- 闭包返回的是一个匿名函数, 但是这个匿名函数引用到函数外的 n ,因此这个匿名函数就和 n 形成一个整体,构成闭包
- 当 go 执行到一个 defer 时,不会立即执行 defer 后的语句,而是将 defer 后的语句压入到一个栈,然后继续执行函数下一个语句。当函数执行完毕后,在从 defer 栈中,依次从栈顶取出语句执行。在 defer 将语句放入到栈时,也会将相关的值拷贝同时入栈。
- 函数的值传递、和引用传递
- 值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct
- 引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型
- 数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的, 不能动态变化
- make的使用:var 切片名 [ ] type = make([ ]type,len,[cap])
- 使用append内置函数,可以使用对切片的动态增长
- map 在使用前一定要 make。a = make(map[string]string,10)
- map 的 key 是不能重复,如果重复了,则以最后这个 key-value 为准
- 使用delete函数对map进行删除
- golang 中的 map 默认是无序的,注意也不是按照添加的顺序存放的,每次遍历,输出可能不同
- map 会自动扩容,并不会发生 panic,也就是说 map 能动态的增长
- struct 的每个字段上,可以写上一个 tag, 该 tag 可以通过反射机制获取,常见的使用场景就是 序列化和反序列化。
- go语言的方法:func (p Person) test(str string) string { }
- 结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式,如果想在方法中修改结构体变量的值,那就传结构体指针。
- Golang 中的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是 struct, 比如 int , float32 等都可以有方法。基本类型需要自定义才能有方法
- 如果一个类型实现了 String()这个方法,那么 fmt.Println 默认会调用这个变量的 String()进行输出。func (p Person) String ( ) string { }
- 在 Golang 中,如果一个 struct 嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。
- 结构体可以 使用嵌套匿名结构体所有的字段和方法,小写的也可以
- 当 结构体和 匿名结构体有相同的字段或者方法时, 编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分
- 如果一个 struct 嵌套了一个有名结构体,这种模式就是 组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字
- 多态的条件,要实现接口中的所有方法
- interface 类型可以定义一组方法,但不需要实现。并且 interface 不能包含任何变量。到某个自定义类型(比如结构体 Phone)要使用的时候,在根据具体情况把这些方法写出来(实现)。
- Golang 中的接口, 不需要 显式的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口
- 接口本身 不能创建实例,但是 可以指向一个实现了该接口的自定义类型的变量
- 一个自定义类型可以实现多个接口。Golang 接口中不能有任何变量
- 一个接口(比如 A 接口)可以继承多个别的接口(比如 B,C 接口),这时如果要实现 A 接口,也必须将 B,C 接口的方法也全部实现
- interface 类型默认是一个指针(引用类型),如果没有对 interface 初始化就使用,那么会输出 nil
- 当 A 结构体继承了 B 结构体,那么 A 结构就自动的继承了 B 结构体的字段和方法,并且可以直接使用。当 A 结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可,因此我们可以认为:实现接口是对继承机制的补充.。
- 继承的价值主要在于:解决代码的 复用性和可维护性。接口的价值主要在于: 设计好各种规范(方法),让其它自定义类型去实现这些方法。
- 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言
- json操作: json.Marshal() 和 json.Unmarshal([]byte(str), &a)
- 主线程是一个物理线程,直接作用在 cpu 上的。是重量级的,非常耗费 cpu 资源。协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
- Golang 的协程机制是重要的特点,可以轻松的 开启上万个协程。其它编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这里就突显 Golang 在并发上的优势了
- channel 中只能存放指定的数据类型,有容量限制。在没有使用协程的情况下,如果对空的channel取数据,会报dead lock 错误
- 当管道中放 interface{} 的时候,可以放任意类型的数据。但是放入的结构体,想拿到结构体中变量时,应该进行断言。
- 使用内置函数 close 可以关闭 channel, 当 channel 关闭后,就不能再向 channel 写数据了,但是仍然可以从该 channel 读取数据
- channel 支持 for–range 的方式进行遍历。在遍历时,如果 channel 没有关闭,则回出现 deadlock 的错误。如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历
- var chan1 chan<- int 声明为只写。var chan1 ->chan int 声明为只读
- 使用 select 可以解决从管道取数据的阻塞问题。可以监听多个管道
- goroutine 中使用 recover,解决协程中出现 panic,导致程序崩溃问题
- 进程和线程是操作系统来调度的,协程是由编译器来调度的。所有的协程调度只有go编译器调度的最好,因此说go是天生的高并发。
go语言语法自我总结相关推荐
- c语言系统关键字6,C语言语法之关键字
由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register typedef char ...
- JScript多语言语法加亮引擎显示(代码精简)
上一篇文章<JScript中正则表达式用法详解>中讲解了JScript中怎样使用正则表达式,这篇文章就给出一个实际应用的例子.昨晚我一边研究JScript中正则表达式的使用就一边在做JSc ...
- Neo4j-Cypher语言语法
为什么80%的码农都做不了架构师?>>> Neo4j-Cypher语言语法 本文是记录Neo4j图数据库中实用的Cypher语言语法. Cypher是什么 "Cyph ...
- 下列符合c语言语法的字符常量是,C语言程序设计(周经亚)选择题练习-chapter 5.doc...
选择题练习一 下叙述中正确的是 [1] . A)在C程序中,main函数必须位于程序的最前面 B)C程序的每行中只能写一条语句 C)C语言本身没有输入输出语句 D)在对一个C程序进行编译的过程中,可发 ...
- java语言语法--- Java标识符(标识符命名规则)、Java关键字、Java变量(变量的声明、赋值、使用)和常量(字符常量、字面常量)(包括Java字节码文件反汇编命令javap)
java语言语法- Java标识符.Java关键字.Java变量和常量(包括Java字节码文件反汇编命令javap) 1.标识符 (1)读音:biao zhi fu (2)什么是标识符? (摘自百度百 ...
- c语言语法格式规范(1)常量的非法与合法
c语言语法格式规范(1)常量的非法与合法 首先确定常量的类型 整型 确定进制,查看各位数的范围是否超界. 8进制常量以前导 0 开始,每位数只能到7 例如:05188 非法 16进制常量以 0x 开始 ...
- c语言中建一个文件的语法,C语言语法介绍_文件.ppt
C语言语法介绍_文件 第十三章 本章要点 文件的基本概念 文件的基本函数 文件的顺序读写 文件的随机读写 文件简单应用 主要内容 13.1 C文件概述 13.2 文件类型指针 13.3 文件的打开与关 ...
- JScript多语言语法加亮引擎改进(修正多行注释识别)
原先多行注释识别的正则/\*.*?\*/不能正常识别,现在修正为:/\*[.\b\w\W]*\*/ 呵呵,简直乱写,反正可以用了就是. 其次行识别现在还没有真正起作用 ...
- drl 规则语言 语法_C语言基本语法规则
drl 规则语言 语法 C language syntax specify rules for sequence of characters to be written in C language. ...
- Python语言语法描述规范BNF介绍
Python语言语法描述规范BNF介绍 读官方的 Python 语言参考(The Python Language Reference)需要了解BNF. BNF(Backus Normal Form:巴 ...
最新文章
- 【天命奇御】成就进度62/71的通关攻略(1·开篇前言)
- 算法分析与设计——蛮力法0/1背包
- 以回调形式使用startActivityForResult方法,并解决Activity被回收的问题
- java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。
- 本地启动 SAP Commerce Cloud(Hybris) 产生的五个 Java 进程
- 技术停滞_检测和测试停滞的流– RxJava常见问题解答
- linux中的fbset工具,Fluxbox (简体中文)
- dll文件懒加载_前端性能优化
- visjs使用小记-2.option参数注释说明
- 第 24 章 状态模式
- Python在定义类方法时self的作用是什么?是否可以不写
- vivo电池损耗指令代码_安川伺服驱动器维修中常用故障代码
- 疯狂java讲义第二章课后习题答案
- 商城开发-用户管理模块(2)
- 进销存系统的成本核算方法一览
- 访问计算机需要用户名密码,访问局域网电脑提示需要用户名和密码该怎么办
- c++ 字符串分割和数字格式化输出
- 009 二维随机变量分布 min max 习题
- 心理健康咨询问卷数据集
- 王者荣耀-是用什么编程语言开发的