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 语言学习笔记的更多相关文章

  1. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  2. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  3. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  4. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  5. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  6. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  7. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  10. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

随机推荐

  1. 043 hive数据同步到mysql

    一:意义 1.意义 如果可以实现这个功能,就可以使用spark代替sqoop,功能程序就实现这个功能. 二:hive操作 1.准备数据 启动hive 否则报错,因为在hive与spark集成的时候,配 ...

  2. day 39 mycql 数据库之约束

    egon笔记: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增 ...

  3. bind注意事项(传引用参数的时候)

    默认情况下,bind的那些不是占位符的参数被拷贝到bind返回的可调用对象中. 当需要把对象传到bind中的参数中时,需要使用ref或者cref. 例如: #include<iostream&g ...

  4. 基于Keil软件的MCU环境搭建

    我们在开发一款新的MCU的时候,偶尔会遇到Keil软件没有对应的Device设备选型,以下,我们以STM32F407VGT6作为实例来演示整个环境的搭建过程: 一.如下所示,我需要选择的是ST公司的S ...

  5. aar上传maven库工具

    需求:本地aar文件上传到maven库 参考我之前的博客gradle上传本地文件到远程maven库(nexus服务器) 下面是java图形化工具代码 package com.jinkejoy.buil ...

  6. hash碰撞POC

    hash碰撞POC: 该类型漏洞POC编写过程难点有二: 一. hash碰撞数据的产生或收集 二. 使用responseTime来判断是否存在hash,如何精确的得到 三. 如何估算出服务器的处理/响 ...

  7. linux 学习笔记 查看端口

    查看端口 #lsof -i  :端口号 |\根据端口号查看进程信息 例如:#lsof -i:8080 command pid  user fd  type  device size node java ...

  8. Xamarin Essentials教程数据处理传输数据

    Xamarin Essentials教程数据处理传输数据 在移动应用程序中,除了常规的数据处理,还涉及数据存储.数据传输.版本数据多个方面.Xamarin.Essentials组件提供了多个数据处理相 ...

  9. loading加载动画效果js实现

    <style>.box { width: 400px; padding: 20px; border: 40px solid #a0b3d6; background-color: #eee; ...

  10. Codeforces.662C.Binary Table(状压 FWT)

    题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵,你可以选择一些行和一些列并将其中所有的\(01\)反转.求操作后最少剩下多少个\(1\). \(n\le ...