go学习笔记-简述
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学习笔记-简述的更多相关文章
- cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)
在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的"词向量"(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一 ...
- CSS学习笔记——简述
CSS3学习的教程来自后盾网 div+css网页标准布局 1>div i>DIV全称是division,意为“区块.分割”,DIV标签是一个无意义的容器标签,用于将页面划分出不同的区域 i ...
- NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...
- [原创]java WEB学习笔记54:Struts2学习之路--- 编写Struts2 的第一个程序,HelloWord,简述 package ,action,result
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- cJSON学习笔记
1.JSON格式简述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.它基于JavaScript(Standa ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- LwIP学习笔记——STM32 ENC28J60移植与入门
0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...
随机推荐
- js 字符串的replace() 方法和实现replaceAll() 方法
一.js中字符串的替换使用replace() 方法,但它只替换第一个匹配子串.如下例: <script type="text/javascript"> var sour ...
- 遍历tr通过name获取对应值用作判断或者赋值
$("#table tr:gt(0)").each(function(i){ var bidPrice = $("input[name='bidPrice2s']&quo ...
- 外网访问内网MariaDB数据库
外网访问本地MariaDB数据库 本地安装了MariaDB数据库,只能在局域网内访问,怎样从公网也能访问内网MariaDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Mar ...
- js中的排序方法
一.冒泡排序 var arr=[22,1,33,19,77]; function bubbleSort(arr){ for(var i=0;i<arr.length-1;i++){ for( ...
- 比较两个Date类型的数据相差几年
package com.utils; import java.text.DecimalFormat; import java.text.ParseException; import java.text ...
- jdbc之工具类DBUtil的使用
首先回顾一下jdbc的使用方法: 1. 注册驱动 2. 建立连接 3. 建立statement 4. 定义sql语句 5. 执行sql语句,如果执行的是查询需遍历结果集 6. 关闭连接 其中建立连接和 ...
- Vue 组件&组件之间的通信 之 使用slot分发内容
slot详细介绍网址:https://cn.vuejs.org/v2/api/#slot 有时候我们需要在自定义组件内书写一些内容,例如: <com-a> <h1>title& ...
- 自制操作系统Antz(9)——实现内核 (下) 实现图形化界面
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...
- pycharm 序列号/行号 的宽度太宽了如何调整
问题:行号宽度嫌宽: 解决:在settings里面,如下图顺序,取消“show gutter icons”的勾,即可. 调整后如下图:
- Poj2018 Best Cow Fences
传送门 题目大意就是给定一个长度为 n 的正整数序列 A ,求一个平均数最大的,长度不小于 L 的子序列. 思路: 二分答案. Code: #include<iostream> #incl ...