
go 语言
文章平均质量分 85
badman250
专注分享IT知识技能
展开
-
1.go语言——入门
简介Go语言是一门简单、高效、安全和并发的语言。简单到甚至不需要有一个符号表来进行词法分析。它可以快速地编译;整个工程的编译时间在秒以下的情况是常事。它具备垃圾回收功能,因此从内存的角度是安全的。它进行静态类型检查,并且不允许强制类型转换,因而对于类型而言是安全的。同时语言还内建了强大的并发实现机制。Go语言的作者在设计这一语言时坚持一个单一的指导原则:简单明了至上。变量是如下声明的:原创 2017-09-27 20:19:54 · 10138 阅读 · 0 评论 -
2.笔记go语言——包
2.笔记go语言——包每个 Go 程序都是由包组成的。程序运行的入口是包 main。这个程序使用并导入了包 "fmt" 和"math/rand"。按照惯例,包名与导入路径的最后一个目录一致。例如,"math/rand" 包由 package rand 语句开始代码package main import ( "fmt"原创 2017-09-27 20:20:57 · 9193 阅读 · 0 评论 -
3.笔记go语言——函数
3.蛤蟆笔记go语言——函数函数函数可以没有参数或接受多个参数。add 接受两个 int 类型的参数。代码package main import "fmt" func add(x int, y int) int { returnx + y} func main() { fmt.Println(add(4原创 2017-09-27 20:21:25 · 8899 阅读 · 0 评论 -
4.笔记go语言——变量
4.笔记go语言——变量var 语句定义了一个变量的列表;跟函数的参数列表一样,类型在后面。就像在这个例子中看到的一样,`var` 语句可以定义在包或函数级别。代码如下:package mainimport "fmt"var c, python, java bool func main() { var iint fmt原创 2017-09-28 21:17:07 · 10442 阅读 · 0 评论 -
5.笔记go语言——基本类型
5.笔记go语言——基本类型基本类型Go 的基本类型有Basic typesboolstringint int8 int16 int32 int64uint uint8 uint16 uint32 uint64 uintptrbyte // uint8 的别名rune // int32 的别名 // 代表一个Unicode码float32 floa原创 2017-09-28 21:17:35 · 9874 阅读 · 0 评论 -
6.笔记go语言——for循环
6.笔记go语言——for循环forGo 只有一种循环结构——`for` 循环。基本的 for 循环除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中做的一样,而 `{ }` 是必须的。package mainimport "fmt"func main() { sum:= 0 for i:=原创 2017-09-28 21:18:13 · 9572 阅读 · 0 评论 -
7.笔记go语言——if,switch,defer
7.笔记go语言——if,switch,deferifif 语句除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中的一样,而 `{ }` 是必须的。package mainimport ( "fmt" "math")func sqrt(x float64) string {原创 2017-09-28 21:18:51 · 9536 阅读 · 0 评论 -
8.笔记go语言——复杂类型struct,slice,map
8.笔记go语言——复杂类型struct,slice,map指针Go 具有指针。 指针保存了变量的内存地址。类型 *T 是指向类型 T 的值的指针。其零值是 `nil`。var p *int& 符号会生成一个指向其作用对象的指针。i := 42p = &i* 符号表示指针指向的底层的值。fmt.Println(*p) // 通过指针 p 读取 i*p = 2原创 2017-09-28 21:19:34 · 9841 阅读 · 0 评论 -
9.笔记go语言——方法和接口
9.笔记go语言——方法和接口方法Go 没有类。然而,仍然可以在结构体类型上定义方法。方法接收者 出现在 func 关键字和方法名之间的参数中。package mainimport ( "fmt" "math")type Vertex struct { X, Yfloat64}func (v原创 2017-09-28 21:20:01 · 9271 阅读 · 0 评论 -
10.笔记go语言——并发
10.笔记go语言——并发goroutinegoroutine 是由 Go 运行时环境管理的轻量级线程。go f(x, y, z)开启一个新的 goroutine 执行f(x, y, z)f , x , y 和 z 是当前 goroutine中定义的,但是在新的 goroutine 中运行 `f`。goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步原创 2017-09-28 21:20:26 · 8106 阅读 · 0 评论 -
11.笔记go语言——内存分配器
11.笔记go语言——内存分配器 内存分配器,又叫做MemoryAllocator. 核心:自主管理,缓存复用,无锁分配。内存管理以页为基本单位,多个地址连续页构成内存块。页是page, 连续页是span.按 8 倍数,将小对象分成多种大小规格。size class.三级管理机构三级管理机构如下图1:算法依赖连续地址,预留原创 2017-09-28 21:21:11 · 8832 阅读 · 0 评论 -
12.笔记go语言——垃圾回收
12.笔记go语言——垃圾回收垃圾回收涉及到:阈值触发,并行标记,并发清理。或者:定期强制回收,释放物理内存。垃圾回收效率总是Go版本升级的核心问题。阈值或强制回收如下图 1:并行标记如下图2:串行或与用户逻辑并发执行如下图3:如阈值过大,可能会导致长时间无法触发垃圾回收。因此,每 2 分钟强制检查回收是非常必要的。每 5 分钟,释放堆中长时原创 2017-09-28 21:23:21 · 8512 阅读 · 0 评论 -
34.笔记go语言——内建函数
34.笔记go语言——内建函数预定义了少数函数,这意味着无需引用任何包就可以使用它们。close new paniccomplex delete make recover real len append print imag cap copy printlnclose 用于channel通讯。使用它来关闭channel.delete 用于在map中删除实例。len和cap 可用原创 2017-10-06 20:23:25 · 10216 阅读 · 0 评论 -
35.笔记go语言——array、slices和map
35.笔记go语言——array、slices和map可以利用array在列表中进行多个值的排序,或者使用更加灵活的:slice。字典或哈希类型同样可以使用,在Go中叫做map。arrayarray由[n]定义,n标示array的长度,而标示希望存储的内容的类型。对array的元素赋值或索引是由方括号完成的.当声明一个array时,你必须在方括号内输入些内容,数字或者三个点(...原创 2017-10-06 20:24:32 · 9536 阅读 · 0 评论 -
36.笔记go语言——函数
36.笔记go语言——函数函数是构建Go程序的基础部件.Go不允许函数嵌套。然而你可以利用匿名函数实现它.作用域在Go中,定义在函数外的变量是全局的,那些定义在函数内部的变量,对于函数来说是局部的。如果命名覆盖——一个局部变量与一个全局变量有相同的名字——在函数执行的时候,局部变量将覆盖全局变量。代码:package mainvar a = 6func main() {原创 2017-10-06 20:24:56 · 9496 阅读 · 0 评论 -
37.笔记go语言——包
37.笔记go语言——包包是函数和数据的集合。用package保留字定义一个包。文件名不需要与包名一致。包名的约定是使用小写字符。Go包可以由多个文件组成,但是使用相同的package 这一行。让我们在文件even.go中定义一个叫做even的包。名称以大写字母起始的是可导出的,可以在包的外部调用.在Go中,当函数的首字母大写的时候,函数会被从包中导出(在包外部可见,或者说公有的)原创 2017-10-06 20:25:19 · 9832 阅读 · 0 评论 -
38.笔记go语言——进阶
38.笔记go语言——进阶Go有指针,但是没有指针运算。不能用指针变量遍历字符串的各个字节。因此它们更象是引用而不是你所知道的来自于C的指针。指针非常有用。Go同样也垃圾收集,也就是说无须担心内存分配和回收。Go有两个内存分配原语,new和make。它们应用于不同的类型,做不同的工作,可能有些迷惑人,但是规则很简单。用new分配内存内建函数new本质上说跟其他语言中的同名函数功原创 2017-10-06 20:25:41 · 8914 阅读 · 0 评论 -
39.笔记go语言——接口
39.笔记go语言——接口在Go中,保留字interface被赋予了多种不同的含义。每个类型都有接口,意味着对那个类型定义了方法集合。接口定义为一个方法的集合。方法包含实际的代码。换句话说,一个接口就是定义,而方法就是实现。因此,接收者不能定义为接口类型,这样做的话会引起invalid receiver type ... 的编译器错误。根据规则,单方法接口命名为方法名加上-er后缀:R原创 2017-10-06 20:26:05 · 8777 阅读 · 0 评论 -
40.笔记go语言——并发
40.笔记go语言——并发goroutine是Go并发能力的核心要素。goroutine有简单的模型:它是与其他goroutine并行执行的,有着相同地址空间的函数。goroutine是一个普通的函数,只是需要使用保留字go作为开头。虽然goroutine是并发执行的,但是它们并不是并行运行的。如果不告诉Go额外的东西,同一时刻只会有一个goroutine执行。利用runtime.原创 2017-10-06 20:26:30 · 8232 阅读 · 0 评论 -
41.笔记go语言——通讯
41.笔记go语言——通讯Go的I/O核心是接口io.Reader和io.Writer。在Go中,从文件读取(或写入)是非常容易的。io.Readerio.Reader接口对于Go语言来说非常重要。许多(如果不是全部的话)函数需要通过io.Reader读取一些数据作为输入。为了满足这个接口,只需要实现一个方法:Read(p []byte) (n int, err error)。写入原创 2017-10-06 20:26:51 · 9599 阅读 · 0 评论 -
42.笔记go语言圣经——go起源
42.笔记go语言圣经——go起源Go 语言起源 2007年,并于 2009 年正式对外发布。该项目的三位领导者均是著名的 IT工程师:RobertGriesemer,参与开发 JavaHotSpot虚拟机;Rob Pike,Go语言项目总负责人,贝尔实验室 Unix团队成员,参与的项目包括 Plan 9,Inferno操作系统和 Limbo编程语言;Ken原创 2017-10-06 20:27:16 · 9109 阅读 · 0 评论 -
43.笔记go语言圣经——go语言特性
43.笔记go语言圣经——go语言特性在声明和包的设计方面,Go语言受到 Pascal、Modula 和 Oberon 系语言的影响;在并发原理的设计上,Go 语言从同样受到 Tony Hoare 的 CSP(通信序列进程 *Communicating Squential Processes*)理论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类原创 2017-10-06 20:27:57 · 8649 阅读 · 0 评论 -
44.笔记go语言圣经——go平台与架构
44.笔记go语言圣经——go平台与架构Go 语言开发团队开发了适用于以下操作系统的编译器:l Linuxl FreeBSDl Mac OS X(也称为 Darwin)目前有2个版本的编译器:Go原生编译器 gc 和非原生编译器 gccgo,这两款编译器都是在类 Unix系统下工作。其中,gc版本的编译器已经被移植到 Windows平台上,并集成在主要原创 2017-10-06 20:29:08 · 14626 阅读 · 0 评论 -
45.笔记go语言圣经——go语言变量
45.笔记go语言圣经——go语言变量Go 开发环境依赖于一些操作系统环境变量,在安装 Go 之间就已经设置好他们。如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go 下。这里列举几个最为重要的环境变量:l $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方。l $GOA原创 2017-10-07 08:22:36 · 14297 阅读 · 0 评论 -
46.笔记go语言圣经——go运行时
46.笔记go语言圣经——go运行时Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。runt原创 2017-10-07 08:23:11 · 13870 阅读 · 0 评论 -
47.笔记go——go连接Oracle
47.笔记go——go连接Oracle 在连接ORACLE数据库之前我们先来看下一个概念OCI。ociORACLE调用接口(Oracle Call Interface简称OCI)提供了一组可对ORACLE数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的。Go-oci下载地址:https://原创 2017-10-07 08:23:38 · 18471 阅读 · 1 评论 -
48.笔记go语言圣经——go图形化
48.笔记go语言圣经——go图形化 GO没有原生的界面库,所以不能直接用来写GUI界面。互联网上已经涌现出不少成熟、好用的第三方界面库。使用它们,就同样可以写出同C#、C++的界面。而且效率还更胜一筹。关于WalkWalk是WindowsApplication Library Kit。在Go 1.1.x 或后续版本后支持。安装:goget github.com/lxn/wal原创 2017-10-07 08:24:04 · 18192 阅读 · 0 评论 -
49.笔记go语言——实现斐波那契
49.笔记go语言——实现斐波那契代码实现代码如下:package mainimport "fmt"// fibonacci 函数会返回一个返回 int的函数。func fibonacci() func()int { var a int = 1 var b int = 1 return f原创 2017-10-07 08:24:37 · 13259 阅读 · 0 评论 -
50.笔记go语言——go语言函数细节
50.笔记go语言——go语言函数细节l Go 里面函数重载是不被允许的Go 语言不支持这项特性的主要原因是函数重载需要进行多余的类型匹配影响性能;没有重载意味着只是一个简单的函数调度。所以你需要给不同的函数使用不同的名字,我们通常会根据函数的特征对函数进行命名l Go 没有泛型(generic)的概念不支持那种支持多种类型的函数。不过在大部分情况下可以通过接口(interfa原创 2017-10-07 08:25:02 · 11826 阅读 · 0 评论 -
51.笔记go语言——go语言数据结构
51.蛤蟆笔记go语言——go语言数据结构主要学习go语言中的基本类型,结构,arrays和slices结构和指针 [5]byte表示有5个字节,类似C的阵列。定义:type Point struct { X, Y int }表示定义一个简单的结构类型叫做Point,包含2个内存中连接的值。如下图1其中Point{10,20}表示一个初始化Point,&Po原创 2017-10-07 08:25:58 · 13462 阅读 · 0 评论 -
52.笔记go语言——defer使用场景
52.蛤蟆笔记go语言——defer使用场景1. 简化资源的回收 比如:mu.Lock()defer mu.Unlock()当然, defer 也有一定的开销, 也有为了节省性能而回避使用的 defer 的.从简化资源的释放角度看, defer 类似一个语法糖, 好像不是必须的.2. panic异常的捕获defer 除了用于简化资源的释放外,还是Go语言异常框架的一原创 2017-10-07 08:28:14 · 12246 阅读 · 0 评论 -
53.笔记go语言——defer,panic,recover使用场景
53.蛤蟆笔记go语言——defer,panic,recover使用场景deferdefer 调用的函数将被暂时保存到调用列表中. 保存的调用列表在当前环境返回的时候被执行. Defer 一般可以用于简化代码, 执行各种清理操作.Defer语句的行为简单且可预测. 有三个基本原则:1. 当defer调用函数的时候, 函数用到的每个参数和变量的值也会被计算2.Defer调用的函数原创 2017-10-07 08:28:38 · 11935 阅读 · 0 评论 -
54.蛤蟆笔记go语言——interface使用1
54.蛤蟆笔记go语言——interface使用1 Go语言中使用interface是比较困难的。使用基本比较简单,但是设计自己的interface就比较困难了。所以如何高效使用interface很有必要。什么是interface 一个interface包含两个东西:一组方法(也是类型),或类型。 例如一个animal 类原创 2017-10-07 08:30:28 · 3361 阅读 · 0 评论 -
55.笔记go语言——go类型
很多人喜欢GO语言的原因是简单。Go语言的类型也是设计的如此简单。预定义类型 Go语言默认定义了一些类型如boolean,numeric和string.这些预定义的类型用于构建其他复杂的类型,例如array,struct,pointer,slice,map,channel等。命名和未命名 类型可以有一个名字也可以没原创 2017-10-08 20:16:59 · 3005 阅读 · 0 评论 -
56.笔记go语言——go的函数类型
56.笔记go语言——go的函数类型 对于动态脚本语言Ruby,JavaScript,Python都有higher-order函数。但是很难直接转换成G知识,虽然GO看上去是同样方式获取。另一方面,之前从事静态语言特别是面向对象语言例如C++,JAVA的,那么问题是使用higher-order函数很少。 很难直接从之前编程原创 2017-10-08 20:17:44 · 3418 阅读 · 0 评论 -
57.笔记go语言——闭包
57.笔记go语言——闭包闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。示例代码如下:packagemain import"fmt" funcExFunc(nint)func(){ sum:=n a:=func(){//把匿名函数作为值赋给变量a(Go不允许函数嵌套。 //然而你可以利用匿名函数实现函数嵌原创 2017-10-08 20:18:08 · 2922 阅读 · 0 评论 -
58.笔记go语言——函数式编程
58.笔记go语言——函数式编程使用函数式编程使代码更抽象和更容易理解先看个例子如下:packagemain import( "fmt") typeStudentstruct{ Name string Age int Heightint} funcmain(){ Students:=[]*S原创 2017-10-08 20:18:33 · 3695 阅读 · 0 评论 -
59.笔记go语言——go语言中的反射
59.笔记go语言——go语言中的反射每个语言都有反射,Go语言也是。Go语言是静态类型,所有数据的类型在编译器都是明确的反射例子一代码如下:packagemain import( "fmt" "reflect") funcmain(){ varxfloat64=3.4 fmt.Println("type:",refl原创 2017-10-08 20:19:00 · 2829 阅读 · 0 评论 -
60.笔记go语言——Go语言的传参和传引用
60.笔记go语言——Go语言的传参和传引用go 参数传递:函数参数全部是传值:即使传递的是指针,传递的也是指针的拷贝;闭包引用外部变量是引用Go语言的函数调用参数全部是传值的, 包括 slice/map/chan 在内所有类型, 没有传引用的说法.slice不是传引用代码如下:packagemain import( "fmt") funcmain原创 2017-10-08 20:19:26 · 3113 阅读 · 0 评论 -
61.笔记go语言——Go语言的nil值和nil
61.笔记go语言——Go语言的nil值和nilNil在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。接口是什么?golang语言的接口有其独到之处:只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做StructuralTy原创 2017-10-08 20:19:54 · 5028 阅读 · 0 评论