Go 语言学习笔记
1. go没有static关键字
面向对象编程中,尽量对函数进行封装,对于没有函数变量的对象,使用static关键字尤其方便。
go中没有static关键字,必须每次new一个出来。
type Handler struct {
}
func NewHandler() *Handler {
h := &Handler{}
return h
}
func (*Handler) Method_1 (){
}
func (*Handler) Method_2 () {
}
2. go没有while; do...while循环
go语言里面的for循环比较灵活
func main(){
for {
fmt.Printf("while true\n")
break
}
for i:=0; i < 5; i = i + 1 {
fmt.Printf("while data:%d\n", i)
}
i := 0
for i < 5 {
fmt.Printf("while ok:%d\n", i)
i = i + 1
}
}
3. go每个协程都必须捕获panic
go中每个协程都必须捕获panic, 否则任何一个协程问题,都会导致整个程序dump掉。
func no_panic_get(a, b int){
/* //每个go协程都必须捕获panic, 否则整个程序都会panic
defer func() {
if r := recover(); r != nil {
fmt.Printf("no_panic_get, err:%v\n", r)
}
}()
*/
c := a / b
fmt.Printf("no_panic_get res:%v\n", c)
}
func main(){
defer func() {
if r := recover(); r != nil {
fmt.Printf("exec failed, err:%v\n", r)
} else {
fmt.Printf("exec success\n")
}
}()
go no_panic_get(1,0) //no_panic_get没有捕获panic, 程序直接panic崩溃
time.Sleep(time.Duration(5 * time.Second))
}
4. go中巧用defer函数逆序执行
defer函数,是在函数最后执行的。
属于先申明,后执行原则;多个defer,申明时入栈,出栈时执行,也就是逆序执行。
只要第一个申明的defer,作为最后一个捕获panic程序执行就可以。
func main(){
defer func() {
fmt.Printf("defer func1\n")
} ()
defer func() {
fmt.Printf("defer func2\n")
} ()
fmt.Printf("main func\n")
}
5. go中巧用interface
interface类似C/C++中的void*类型,可以将任何类型转为interface类型。
不同的是, interface可以确定保存的是那种类型的数据. 使用 v.(type)
type A struct {
age int
sex string
}
type B struct {
peer []string
name string
}
func main(){
aData := &A{age:19}
bData := &B{[]string{"zhangsan", "lisi"},"wang"}
ctx := make(map[string]interface{}) //容器
ctx["1"] = aData
ctx["2"] = bData
for _, v := range ctx {
switch v.(type) {
case *A:
fmt.Printf("type A %v\n", v)
case *B:
fmt.Printf("type B %v\n", v)
default:
fmt.Printf("type unkown\n")
}
}
}
6. go注意大小写
go中大小写区分访问权限, 在定义函数,定义变量时需要注意。
小写变量,不能被json序列化。
小写函数,外部不能访问。
go1.4 之前版本中, map[int]string, 因为key是int不能正确序列号。
type Stu struct {
Age int
Name string
}
func main(){
ctx := make(map[int]*Stu)
ctx[1] = &Stu{12,"li"} //按照定义顺序初始化
ctx[2] = &Stu{ Age:18} //初始化部分字段; 其他字段默认值
jsonres, _ := json.Marshal(ctx)
result := string(jsonres)
fmt.Printf("%s\n", result)
newctx := make(map[int]*Stu)
if err := json.Unmarshal([]byte(result), &newctx); err == nil { //第二个参数需要是一个指针
for k, v := range newctx{
fmt.Printf("k:%v val:%v\n", k, v)
}
}
}
7. go中变量申明后都有默认值
在go语言中,任何类型在声明后没有赋值的情况下,都对应一个零值。
- 整形如int8、byte、int16、uint、uintprt等,默认值为0
- 浮点类型如float32、float64,默认值为0
- 布尔类型bool的默认值为false
- 复数类型如complex64、complex128,默认值为0+0i
- 字符串string的默认值为""
- 错误类型error的默认值为nil
- 对于一些复合类型,如指针、切片、字典、通道、接口,默认值为nil。而数组的默认值要根据其数据类型来确定。例如:var a [4]int,其默认值为[0 0 0 0]
8. go中可以使用fmt构造一个error类型返回
go语言函数是支持多返回值的,因此在写go函数时,都会带一个error类型返回值表示是否有错误。
可以使用fmt构造一个error返回。
func getError() error {
a := 1
b := 0
return fmt.Errorf("a/b is not vaild, a:%d b:%d", a, b)
}
func main(){
fmt.Printf("err[%v]", getError())
}
Go 语言学习笔记的更多相关文章
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- 2017-04-21周C语言学习笔记
C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...
- 2017-05-4-C语言学习笔记
C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- Go语言学习笔记十三: Map集合
Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
随机推荐
- AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ ...
- Collection接口的常用方法
[添加功能] boolean add(Object obj); //添加一个元素. boolean addAll(Collection c); //添加一个集合的元素(在后面追加). [删除功能] v ...
- 07. Matplotlib 3 |表格样式| 显示控制
1.表格样式创建 表格视觉样式:Dataframe.style → 返回pandas.Styler对象的属性,具有格式化和显示Dataframe的有用方法 样式创建:① Styler.applymap ...
- 怎样将一个Long类型的数据转换成字节数组
直接上代码: //先写进去 long n = 1000000L; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutpu ...
- 如何生成WebAssembly文件?
许多3D游戏都是用C/C++语言写的,如果能将C/C++语言编译成JavaScript代码,它们不就能在浏览器里运行了吗?Emscripten的底层是LLVM编译器,Emscripten可以将c/c+ ...
- Django Simple Captcha插件
正文开始 先看官方描述 1.安装 打开控制台,输入如下: pip install django-simple-captcha 2.把APP添加到Django项目进入自己的Django项目,在setti ...
- ppt字体
字体也需要设计. 太大众不太好. ppt自带的字体样式 有毛笔风格的.vrinda. 其他的和这个字体样式差不多.选其中一个就可以了. 其他的个性样式就需要下载字体扩展了.作为经常做ppt的,还 ...
- SQL Server中的标识列
一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: .列的数据类型为不带小数的数值类型 .在进行插入(Insert)操作时,该列的值是由 ...
- Ubantu17.10 上安装gitlab
http://www.jianshu.com/p/92f97939e33a 亲测成功
- Yahoo Programming Contest 2019.E.Odd Subrectangles(思路 线性基)
题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵.求任意选出\(r\)行.\(c\)列(共\(2^{n+m}\)种方案),使得这\(r\)行\(c\)列的 ...