1、程序结构

Go程序结构和C系程序(C/C++/JAVA等)一致,基本语句被组织成函数用于隔离和复用,函数组成源文件和包。Go程序存储在一个或多个.go文件中,每个文件都已pakage开头,表面当前文件属于哪个包;package语句后面是import语句,用于包含其他包以便于使用其他包中的元素;之后是包级别的类型、变量、常量、函数声明,声明不用区分前后顺序。

例:

pakage main
import “fmt”
var name = “tony”
func main(){ //函数、控制语句的前半大括号必须和函数名在同一行
fmt.Printf(“name = %s”,name)
}

注意:变量声明区别于C的是类型后知,例如var name string;

特点:对比C,go有如下常见特点:

1)、变量声明还可以通过返回值完成,例如name := getname(),称之为短声明;

2)、函数返回值可以有多个,例如ret1,ret2 = getret(),ret1和ret2将获得getret函数返回的两个参数;同时赋值表达式也可以多重赋值,如x,y=10,20 ;

3)、赋值多了一种“:=”,这种用法用于定义一个类型是返回值类型的变量,同时该变量的值为返回值。是一种方便程序员的特性;

4)、新类型声明用type关键字;例如 type mytype string,那么mytype可以等价于string;

5)、包初始化时从包级别变量开始,这些变量按照声明顺序初始化,对于多个文件的包,初始化顺序是传给编译器的文件顺序,每个包,甚至每个文件都可以定义一个init函数,在里边可以自定义初始化一些内容,这个函数会在初始化阶段自动调用,且这个函数不是给用户调用的。

2、数据类型

go的数据类型包括基础类型、聚合类型、引用类型、接口类型四大类。

基础类型包括数字、字符串和布尔型;聚合类型有数组和结构体;引用类型包括slice、指针、map、函数、通道;接口类型即“接口”类型。

1)、基础类型使用上参考C系语言,差别不大,不过go对这些基础类型做了各种优化,比如内置复数类型、提供常量生成器、方便操作字符串等。

2)、数组和结构体长度都是固定的,slice和map的长度是可以动态增长的;

  ①、slice表示一个拥有相同元素的可变长序列,通常写作[]T ;slice有三个属性,指针、长度、容量,在长度变长的过程中,容量会适时的增加以适应元素增加;len和cap用来返回slice的长度和容量;

  ②、map,即键值对类型,这种类型在日常开发者很常用,所以go内置了;map的类型是map[K]v ;map要求k必须是相同类型,V是相同类型,但K和V的类型可以不同;并且要求K的值必须是可以通过==操作符来进行比较的数据类型,目的是可以检索某一个K是否已经存在。map表示为map[k]v{}

③、结构体类似于C系语言的结构体;

④、go标准库支持操作json、xml等常用格式标记语言。

3、函数

go函数声明如下格式:

 func name(para-list) (ret-list){
body
} 

常规操作类似于C系语言,所以不再多加描述。

特性:延迟函数调用

用defer关键字后跟函数调用,这种格式的函数调用将会在当前函数执行流程结束后执行;不管是正常return还是程序产生异常都会在最终调用defer语句;defer语句可以在需要的地方多次调用,defer语句经常适用于成对操作中,如文件打开关闭,这时无论文件操作成功与否最后肯定是要关闭文件的,所以这一特性是很有用的。

resp.err := http.Get(url)
if err != nil{
return err
}
defer resp.Body.Close()

4、方法

方法在本质上等同于函数,但它是对于面向对象编程而言的;go是一种支持大多数面向对象编程特性的编程语言,所以也存在继承、复用等。

方法声明和普通函数相比函数前面多了个参数,如下:

func (p class) name(para-list) (ret-list){
body
}

多出的这个类参数意图是把当前函数绑定到这个参数对应的类型上。和C系语言不同的是这个参数显示指定了特定类型实例p,而不是用隐性的this、self、that等;这样的好处是由用户自己选择当前方法的接收者p 。

以上的p也可以是指针类型,这样可以避免参数复制。

合法的方法调用仅以下三种情况:

//以下三种情况的 前置条件

func (p Point)  Distance(q Point) float64 {
body
}
func (p *Point) ScaleBy (q Point) float64 {
body
}
var pptr *Point

1)、实参接收者和形参接收者类型相同,即同是T或*T

Point{1,2}.Distance(q) //Point

pptr.ScaleBy(q)   //*Point

2)、实参接收者是T而形参接收者是*T,编译器会隐式获取地址;

p. ScaleBy(q) //

3)、实参接收者是*T而形参接收者是T,编译器会隐式转换。

pptr.Distance(q)

Notice:  nil是个合法接收者

5、封装

go只有一种方式控制命名的可见性:定义的时候首字母大写的标识符是可以从包中导出的,小写的标识符只能在包中使用。

6、接口

接口类型是对其他类型行为的概括和抽象。接口类型是一种抽象类型,它提供的仅仅是一些方法。举个例子:

type ControllerInterface interface {
  Init(ct *context.Context, controllerName, actionName string, app interface{})
  Get()
  Post()
  Delete()
  Put()
  Head()
  Patch()
  Options()
}

一个接口类型定义了一组方法,如果一个具体类型要实现这个接口,那么他必须实现接口类型中提供的所有方法。

如果一个类型实现了一个接口所要求的的所有方法,那么这个类型实现了这个接口;接口的赋值规则很简单,仅当一个表达式实现了一个接口时这个表达式才能赋值给该接口。

package io

type Reader interface{
Read()
}
type ReadWriter interface{
Read()
Write()
}
type Writer interface{
Write()
}

依据以上前置条件以下赋值情况为:

         var w io.Writer

         w =os.Stdout //可以 *osFile 有write方法

         w = time.Secound //不可以 未实现write方法

所以,接口可以当做普通变量看待,申请变量时它是nil,仅当赋值特定实现它要求的方法的类型后它将获得这个类型的具体方法,之后用这个变量完成特定的操作。

类型断言:

形如X.(T)的操作称之为类型断言,其中X是一个接口类型表达式,T是一个类型;类型断言会检查作为操作数的动态类型是否满足指定的断言类型;作用结果分为两种可能:

1)、T是一个具体类型,从它的操作数中把具体类型的值提取出来;

var w io.Writer

w = os.Stdout

f := w.(*os.File) // f = os.Stuout

2)、 T是一个接口类型,从一个接口类型向另一个更宽松的接口类型转化(方法增多)

var w io.Writer

w = os.Stdout

     rw := w.(io.ReadWriter) // 成功,rw将会变成包含Read和Write的接口

7、并发编程

go支持两种类型的并发编程风格,goroutine+channel风格(CSP)和共享内存多线程风格,go编程中第一种比较常见,因为使用很简单方便。

go里每一个并发执行的活动称为goroutine;在函数调用或者表达式前加关键字go即可达成创建新的goroutine去执行表达式任务的目的;所以比起传统的多线程编程要简单得多。

当然程序执行的时候创建很多goroutine达成并发执行的目的了,但这些goroutine之间如果不能有效沟通那程序的功能将很大程度上受限,所以我们需要这些goroutine之间通信的机制,此处引入channel(通道)

go学习笔记-简述的更多相关文章

  1. cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)

    在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的"词向量"(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一 ...

  2. CSS学习笔记——简述

    CSS3学习的教程来自后盾网 div+css网页标准布局 1>div i>DIV全称是division,意为“区块.分割”,DIV标签是一个无意义的容器标签,用于将页面划分出不同的区域 i ...

  3. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)

    FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...

  4. [原创]java WEB学习笔记54:Struts2学习之路--- 编写Struts2 的第一个程序,HelloWord,简述 package ,action,result

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. cJSON学习笔记

    1.JSON格式简述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.它基于JavaScript(Standa ...

  7. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  8. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  9. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言     去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...

随机推荐

  1. Lua 判断文件类型为wav

    [1]应用示例 文件类型为wav格式 -- 判断文件类型 local function isType(filename) local res = string.match(filename, &quo ...

  2. Linux机器重启情况查询

    在实际开发过程中,有时可能发现有一些服务器的进程挂了,查询相关错误日志也没有头绪.此时需要考虑是否是由于机器重启导致的错误 使用命令last reboot来查看是否机器自动重启 导致服务器重启的原因有 ...

  3. Mysql复制一个数据库到另一个数据库

    mysqldump -u root -p source_db > /home/db_bak.sql #导出数据库 123456 #输入数据库密码 扩展: mysqldump -u root -p ...

  4. sql查询语句如何执行

    MySQL 可以分为 Server 层和存储引擎层两部分. 查询缓存: Mysql拿到一个查询请求之后,会先查询缓存,之前执行过的语句及结果可能会以Key-Value的形式被存在缓存中,Key是查询语 ...

  5. git cherry-pick 的使用

    之前和同事在不同的分支开发一个功能的不同模块,在自己分支有用到同事分支的一些实现,被老大告诉用git cherry-pick来搞定! git cherry-pick  能够把另一个分支的一个或多个提交 ...

  6. 2019/4/15 wen 正则表达式

  7. 【模板】快速幂&取余运算

    输入\(b\),\(p\),\(k\)的值,求\(b^p mod k\)的值.其中\(b\),\(p\),\(k^2\)为长整型数. 1.普通做法 \(print\) \(pow(b,p)\)\(mo ...

  8. Linux直播推流

    Linux系统实现youtube推流直播 系统:centos-7 软件:FFMPEG, youtube-dl 1. 安装FFMPEG 创建并cd到一个目录,下载最新的FFMPEG(下面是64位,32位 ...

  9. JavaScript中对象和数组的深拷贝

    不管是在面试中还是我们的项目中经常会用到数组或者对象的深拷贝,下面我就自己总结的分享给大家. 首先要知道什么是深拷贝?什么是浅拷贝? 深拷贝:源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另 ...

  10. 清北学堂北京大学冯哲神仙讲课day2

    今天讲基础数据结构 首先讲(二叉搜索树) 保证左儿子小于右儿子,那么对于根节点来说.大于根节点的放到右子树递归,小于根节点的放在左子树 相等的呢?某大佬(老师)这么说: 删除的前提是找这个点在哪: 如 ...