更新:
进程有自己独立的堆和栈,不共享堆和栈。
线程有自己独立的栈和共享的堆,不共享栈。
协程和线程一样共享堆,不共享栈。协程有程序员在协程的代码里显示调度。

执行协程只需要极少的栈内存(大概是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超详细基础语法黑点相关推荐

  1. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  2. Python超详细基础入门教程

    Python超详细基础教程(一) 一.变量和简单数据类型 (一)修改字符串大小写 (二)制表符和换行符 (三)删除空白 (四)数 二.列表 (一)列表定义 (二)修改.添加和删除元素 (三)组织列表 ...

  3. ECharts实现数据可视化超详细基础入门教程

    ECharts实现数据可视化超详细基础入门教程 ECharts介绍 ECharts官网:https://echarts.apache.org/zh/index.html ECharts是一款基于Jav ...

  4. Python超详细基础教程,从入门到实践

    Python超详细基础入门 一.变量和简单数据类型 (一)修改字符串大小写 (二)制表符和换行符 (三)删除空白 (四)数 二.列表 (一)列表定义 (二)修改.添加和删除元素 (三)组织列表 三.操 ...

  5. HTML超详细基础知识总结

    文章目录 前言 一.互联网基本原理 1.在本地开发,在服务器共享 2.关于 HTTP 协议 3.前后端请求交互基本流程 二.HTML基础语法以及延伸 1.HTML解析 1.1.什么是HTML 1.2. ...

  6. Docker超详细基础教程

    一.Docker介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, ...

  7. 极速Go语言入门(超全超详细)-基础篇

    文章目录 文章目录 Golang概述 Go语言三大牛 谷歌创造Golang的原因 Golang 的发展历程 Golang 的语言的特点 Go语言开发工具 Go开发环境配置(sdk下载及配置) 使用开发 ...

  8. 学习Java必知的超详细基础|【大学生博客大赛】

    初始java 个人见解 我的java个人心得,入门很重要,但是大多数人都搞错了方向,把入门变成了入土: 第一.切记不要一上来就找一大本厚书看.这样你绝对会放弃.<Java核心技术>< ...

  9. 全网最全超详细.htaccess语法讲解

    (基础) 一.正则表达式 $ 匹配输入字符串的结尾位置.如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'.要匹配 $ 字符本身,请使用 \$.^ 匹配 ...

最新文章

  1. PowerPath/VE:EMC夯实虚拟环境的独门武器
  2. 音视频技术开发周刊 58期
  3. jQuery 基础教程 (五)之使用jQuery创建动画效果
  4. ARM 编译选项的默认关系 001
  5. 《奠基计算机网络》2011年8月15日出版 视频下载 http://www.91xueit.com
  6. java 认证和授权_SpringSecurity一:认证和授权
  7. PowerDesigner显示Comment注释栏
  8. oracle删除列的限制,深入理解Oracle索引(10):索引列字符类型统计信息的32位限制...
  9. mysql 集群操作系统_mysql集群部署
  10. android文件关联之mime type
  11. bat命令批量删除当前目录下指定格式之外的文件和文件夹
  12. windows2003r2下载
  13. 数字电路:边沿触发的D触发器简析
  14. C/C++ 如何判断闰年,对判断闰年条件的疑惑解答
  15. 冷战与战后东亚国际秩序:影响及后果
  16. 英雄联盟怎么解除小窗口_英雄联盟手游安妮怎么样 英雄联盟手游安妮技能介绍...
  17. Python基础三、2、list列表练习题 引用随机数
  18. 理性的光辉,“哥德尔不完备定理”到底说了些什么?
  19. ORACLE学习笔记(七)——DBMS_LOB包的学习和使用
  20. 终于解决困扰我多年的问题 浙江绍兴这边 洋拉毛树 树名原来叫 毛白杨 春天种子满天飞

热门文章

  1. word文档怎么一分为二_微信文章怎么转成word文档,这个强大工具可以帮你搞定...
  2. php调用trait方法,PHP Laravel中的Trait使用方法
  3. mysql 跳过一个事物_MYSQL GTID跳过指定事务
  4. 如何用 Visual Studio 2017 开发 Arduino 应用程序
  5. OutputDebugString输出调试信息
  6. android xml显示调整,AndroidStudio中怎么设置xml与预览同时显示?
  7. 含有bin的mysql_MySQL 5.7.18 release版安装指南(含有bin文件版本)
  8. ubtil类oracle,oracle中报错Connect internal only, until freed
  9. redis五种数据类型的使用场景
  10. 数据库-SQL Server2005-第4季SQL从入门到提高-2SQL Server使用