GO超详细基础语法黑点
更新:
进程有自己独立的堆和栈,不共享堆和栈。
线程有自己独立的栈和共享的堆,不共享栈。
协程和线程一样共享堆,不共享栈。协程有程序员在协程的代码里显示调度。
执行协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。
最新更新
GO的黑点
GC1.0在32位环境下有重大缺陷,导致整个进程停顿严重。只能减少进程中的对象,将它的间歇性停顿控制在可接受范围内。
禁止未使用变量和多余import,存在则编译错误,如import某数据库驱动的pkg,删掉编译通过但是运行时必然报错,找不到数据库驱动。
创建对象的方式太多令人纠结
defer的语义定义设定不够合理
有无限循环语句不停地创建资源,defer语句得不到执行
系统存储defer列表也要格外占用资源
defer设定在所属代码块结束时执行,更好
没有泛型支持
list,set这些常见的数据类型的接口,放进去的对象是一个具体的类型,取出来只能是无类型的interface{},得强制类型之后才能继续使用
实现接口不需要明确声明:
http://blog.zhaojie.me/2013/04/why-i-dont-like-go-style-interface-or-structural-typing.html
静态编译的文件尺寸很大
complex浮点数
rune(32位)4个字节 ,相当于C 语言的Char
变量类型写在变量名之后
函数返回类型也写在方法最后,如fun grade( score int) string{}
var a=可以写作a:=
编译器自动推测变量类型
原生支持复数
枚举const(b=iota)(自增)
if条件不需要括号
if可以赋值
if可以把判断语句写在;后面
for也不带括号
初始,结束条件,递增表达都可以省略
switch自动带break,后面可以不跟条件判断
用传入分数来判断成绩等级
switch score{}的话必须内部是score=XX,来我们内部是grade="A"等等,所以要直接switch
返回两个值的函数,只想return第一个值:
q,_:=div(a,b)
return q
函数也可以作为其他函数的参数
没有默认参数,可选参数,没有重载
反射:runtime.FuncForPC().Name()
数组:数组名…
i:=range 数组名
GO语言只支持值传递(经典的i++不改变输出值)
数组、切片、容器
arr:=[3]int{1,3,5}这种写法必须要初始化
for i,v:=range arr3{
fmt.Println(i,v)//同时获得序号和值
}
[10]int和[20]int是不同类型
调用func f(arr [10] int)打印拷贝后加工过的数组
直接打印原来arr还是原来的那些值
没有C语言的:数组名就是数组头指针
切片
arr[:]打印全部
arr[2:6]打印下标2到5
slice改变的东西会一直保持修改后的状态
slice本身没有数据,是对底层array的一个view
reslice:slice的slice 即使下标不被包含在二次slice后的内容里,也能打印出来
slice可以向后扩展
原因:
向slice添加元素 如果超越cap,系统会分配更大的底层数组
分配cap由1 2 4一直到128
s :=make([]int,16)
s :=make([]int,16,32)
copy(s2,s1)让s1替换s2的相应部分
假如要删除[0 2 4 6 8 0 0 0 0]中的8,用s=append(s[:4],s[4:])
删除第一个
front:=s[0]
s=s[1:]
删除队尾
tail:=s[len(s)-1]
s=s[:len(s)-1]
slice扩容可以参考:
https://www.cnblogs.com/junneyang/p/6074786.html
map定义:map[K]V
复合map:map[K1]map[K2]V
打印顺序不是定义顺序,是无序的
m:=make(map[string] int)自动初始化为空
for k,v range m{
fmt.Print(k,v)}
取值
name,ok:=m[K]
fmt.Println(name,ok)//打印名字和true or false
delete(m,“name”)
Java要实现HashCode和Equals才能作为key
map使用哈希表,必须可以比较相等
除了slice,map,fuction的内建类型都可以作为key
最长不重复字串
核心函数
for i,ch:=range []byte(s){lastI,ok:=lastOccured[ch]//lastI是遍历的字符的上一次出现过的下标,默认为0因为map的V默认没有内容,Ok代表V是否有内容,也就是是否出现过if ok&&lastI>=start {start=lastI+1//关键要理解这里的start即最长不重复字串的开头必须要在上一个出现了的字母的后面}if i-start+1>maxlength{maxlength=i-start+1}lastOccured[ch]=ifmt.Println(ch,lastI,start,ok,maxlength,lastOccured[ch])
}
return maxlength
%X打印字节数,使用utf8.RuneCOuntInString()获得字符数,len获得字节数,[]byte获得字节
其他操作在strings包里面 fileds join split contains index 等
面向对象:
只支持封装,不支持继承和多态
只有struct,没有class
不论地址还是结构本身, 都用.来访问成员
局部变量放在堆上还是栈上不需要知道,GC会决定
为结构定义方法:
接受的参数写在方法前面的()
func(node *TreeNode)setValue(value int){
node.value=value;
}
接收者,即是任意类型(结构体,指针,接口等)的实例。函数跟类型绑定,即成了方法
只有指针才可以改变结构内容
nil指针也可以调用方法
遍历树:
func(node *treeNode) traverse(){
if node==nil{
return
}
node.left.traverse()
node.print()
node.right.traverse()
}
首字母大写代表public
首字母小写代表private
每个目录只能有一个包
包名可以跟目录名不一样
扩充系统类型或用别人的类型:
定义别名
使用组合
面向接口的编程语言,不是面向对象
duck typing。像鸭子走路,像鸭子叫,就是鸭子
描述事物的外部行为而非内部结构
python
def download(retriever):
return retriever.get("")
//运行时才知道retriever有没有get
C++
template
string download(const R& retriever){
return retriever.get("")}
//编译时才知道传入的retriever有没有get
java一定要继承接口 但有时需要两个接口的功能,java做不到
同时有python的灵活性,又有java的类型检查
接口由使用者定义
接口必须要有结构体
/* 定义接口 */
type interface_name interface {method_name1 [return_type]method_name2 [return_type]method_name3 [return_type]...method_namen [return_type]
}/* 定义结构体 */
type struct_name struct {/* variables */
}/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {/* 方法实现 */
}
接口 接口=new (结构体)
defer 在return前把函数执行
defer先进后出
使用的时机:Open/Close,Lock/Unlock,PrintHeader/PrintFooter
GO超详细基础语法黑点相关推荐
- Linux 学习笔记之超详细基础linux命令 Part 3
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...
- Python超详细基础入门教程
Python超详细基础教程(一) 一.变量和简单数据类型 (一)修改字符串大小写 (二)制表符和换行符 (三)删除空白 (四)数 二.列表 (一)列表定义 (二)修改.添加和删除元素 (三)组织列表 ...
- ECharts实现数据可视化超详细基础入门教程
ECharts实现数据可视化超详细基础入门教程 ECharts介绍 ECharts官网:https://echarts.apache.org/zh/index.html ECharts是一款基于Jav ...
- Python超详细基础教程,从入门到实践
Python超详细基础入门 一.变量和简单数据类型 (一)修改字符串大小写 (二)制表符和换行符 (三)删除空白 (四)数 二.列表 (一)列表定义 (二)修改.添加和删除元素 (三)组织列表 三.操 ...
- HTML超详细基础知识总结
文章目录 前言 一.互联网基本原理 1.在本地开发,在服务器共享 2.关于 HTTP 协议 3.前后端请求交互基本流程 二.HTML基础语法以及延伸 1.HTML解析 1.1.什么是HTML 1.2. ...
- Docker超详细基础教程
一.Docker介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, ...
- 极速Go语言入门(超全超详细)-基础篇
文章目录 文章目录 Golang概述 Go语言三大牛 谷歌创造Golang的原因 Golang 的发展历程 Golang 的语言的特点 Go语言开发工具 Go开发环境配置(sdk下载及配置) 使用开发 ...
- 学习Java必知的超详细基础|【大学生博客大赛】
初始java 个人见解 我的java个人心得,入门很重要,但是大多数人都搞错了方向,把入门变成了入土: 第一.切记不要一上来就找一大本厚书看.这样你绝对会放弃.<Java核心技术>< ...
- 全网最全超详细.htaccess语法讲解
(基础) 一.正则表达式 $ 匹配输入字符串的结尾位置.如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'.要匹配 $ 字符本身,请使用 \$.^ 匹配 ...
最新文章
- PowerPath/VE:EMC夯实虚拟环境的独门武器
- 音视频技术开发周刊 58期
- jQuery 基础教程 (五)之使用jQuery创建动画效果
- ARM 编译选项的默认关系 001
- 《奠基计算机网络》2011年8月15日出版 视频下载 http://www.91xueit.com
- java 认证和授权_SpringSecurity一:认证和授权
- PowerDesigner显示Comment注释栏
- oracle删除列的限制,深入理解Oracle索引(10):索引列字符类型统计信息的32位限制...
- mysql 集群操作系统_mysql集群部署
- android文件关联之mime type
- bat命令批量删除当前目录下指定格式之外的文件和文件夹
- windows2003r2下载
- 数字电路:边沿触发的D触发器简析
- C/C++ 如何判断闰年,对判断闰年条件的疑惑解答
- 冷战与战后东亚国际秩序:影响及后果
- 英雄联盟怎么解除小窗口_英雄联盟手游安妮怎么样 英雄联盟手游安妮技能介绍...
- Python基础三、2、list列表练习题 引用随机数
- 理性的光辉,“哥德尔不完备定理”到底说了些什么?
- ORACLE学习笔记(七)——DBMS_LOB包的学习和使用
- 终于解决困扰我多年的问题 浙江绍兴这边 洋拉毛树 树名原来叫 毛白杨 春天种子满天飞
热门文章
- word文档怎么一分为二_微信文章怎么转成word文档,这个强大工具可以帮你搞定...
- php调用trait方法,PHP Laravel中的Trait使用方法
- mysql 跳过一个事物_MYSQL GTID跳过指定事务
- 如何用 Visual Studio 2017 开发 Arduino 应用程序
- OutputDebugString输出调试信息
- android xml显示调整,AndroidStudio中怎么设置xml与预览同时显示?
- 含有bin的mysql_MySQL 5.7.18 release版安装指南(含有bin文件版本)
- ubtil类oracle,oracle中报错Connect internal only, until freed
- redis五种数据类型的使用场景
- 数据库-SQL Server2005-第4季SQL从入门到提高-2SQL Server使用