go语言

《Go语言实战》读书笔记之Golang的映射

陌路散爱 提交于 2020-03-03 07:53:42
映射是一个存储键值对的无序集合 创建和初始化 make函数创建 //创建一个映射,键的类型是string,值的类型是int dict := make(map[string]int) 使用映射字面量创建 //创建一个键和值类型都是string的映射 dict := map[string]string{"Red": "#da1337", "Orange": "#e95a22"} 使用映射 //创建一个空映射 colors := map[string]string{} //将Red加入映射 colors["Reds"] = "#da1337" //声明一个未初始化的映射来创建一个nil映射,nil映射不能存储键值对 var colors = map[string]string //判断映射中是否存在某个键 //第一种方法从映射取值, value是值,exists表示这个键是否存在 value, exists := colors["Bule"] if exists { fmt.Println(value) } //第二种方法从映射取值,只返回对应的值,然后判断这个值是不是零值 value := colors["Blue"] if value != "" { fmt.Println(value) } 注:在Golang映射中即使这个键不存在也总会返回一个值,该值是对应类型的零值 /

Go语言以太坊DApp开发教程

给你一囗甜甜゛ 提交于 2020-03-03 00:12:17
以太坊是备受关注的区块链,它基于密码学技术和P2P通信技术构建了一个去中心化的平台,所有的交易同步保存在每个节点中,通过将区块单向级联成链,以太坊有效的保证了交易的不可篡改: 智能合约平台 以太坊是第一个实现了虚拟机的区块链,因此为智能合约 - Smart Contract - 的运行提供了良好的支持环境。也正因为这个原因,以太坊被称为区块链2.0,以区别于比特币代表的以数字加密货币为核心特征的区块链1.0。 可以将智能合约理解为机器之间的合同约定,在满足一定条件时自动执行约定好的逻辑,例如在保险理赔流程中,如果理赔条件满足就自动将赔偿金释放给出险人,这个流程就可以使用智能合约来实现。 有多种语言可以开发以太坊智能合约,但目前最常用的是类似于JavaScript的Solidity语言。本课程中将采用Solidity讲解智能合约的开发。 JSON RPC 如果我们希望构造一个去中心化应用( DApp ),除了智能合约的开发,通常还需要使用其他开发语言为用户提供操作智能合约的用户接口,例如开发一个网页、一个手机App或者一个桌面应用。这些代码都需要与以太坊进行交互。 以太坊规定了每个节点需要实现的 JSON RPC API 应用开发接口,该接口是传输无关的,应用程序可以通过HTTP、websocket或IPC等多种通信机制来使用该接口协议操作以太坊节点:

GO语言并发

对着背影说爱祢 提交于 2020-03-02 19:03:52
并发与并行 并发:同一时间段执行多个任务 并行:同一时刻执行多个任务 Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。 Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是 Go 语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。 goroutine goroutine 的概念类似于线程,但 goroutine 由 Go 程序运行时的调度和管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。Go语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。 使用goroutine Go 程序中使用go关键字为一个函数创建一个goroutine。一个函数可以被创建多个 goroutine,一个goroutine必定对应一个函数。 启动单个goroutine 在调用的函数(普通函数和匿名函数)前面加上一个go关键字。 func hello() { fmt.Println("Hello ares!") } func main() { hello()

go-函数

馋奶兔 提交于 2020-03-02 18:34:01
函数是组织好的、可重复使用的、用于执行指定任务的代码块。 函数 Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。 函数允许多返回值; 函数本身可以作为值进行传递; 函数可以作为变量的值; 函数可以作为参数和返回值; 支持匿名函数(没有名字的函数)一般用于工厂模式; 可以满足接口; 函数:可重复使用的、实现单一或相关联的代码片段,其目的是模块化编程,提高模块性和代码的复用率。 函数的定义 Go语言中定义函数使用 func 关键字,具体格式如下: 1 func 函数名(参数)(返回值){ 2 函数体 3 } 其中: 函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名。 参数:参数由参数变量和参数变量的类型组成,多个参数之间 , 使用分隔。 返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用 () 包裹,并用 , 分隔。 函数体:实现指定功能的代码块。 我们先来定义一个求两个数之和的函数: 1 func intSum(x int, y int) int { 2 return x + y 3 } 函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数: 1 func sayHello() { 2 fmt.Println("Hello 望京") 3 }

Go语言sync.Pool(临时对象池)

落花浮王杯 提交于 2020-03-02 11:12:16
Golang在sync里面提供了对象池Pool。一般大家都叫这个为对象池。众所周知,go是自动垃圾回收的,这大大减少了程序编程负担。但gc是一把双刃剑。比如对刚刚上手的程序员是友好的,但是后期随着项目变得越来越巨大,维护的内存问题也会逐渐暴露出来。 sync.Pool是一个可以存或取的临时对象池。对外提供New、Get、Put等API。本文对sync.Pool进行分析。 Pool设计的目的是什么? Pool 用来保存和复用临时对象,以减少内存分配,降低CG压力。 代码实现 关于代码的实现,最好的办法就是看源代码(src/pkg/sync/pool.go)。 数据结构定义如下: Pool结构体: type Pool struct { noCopy noCopy local unsafe . Pointer // local fixed-size per-P pool, actual type is [P]poolLocal localSize uintptr // size of the local array victim unsafe . Pointer // local from previous cycle victimSize uintptr // size of victims array // New optionally specifies a function to

go语言之goroute协程

早过忘川 提交于 2020-03-02 10:10:42
goroute协程 进程和线程 进程是系统进行资源分配和调度的基本单位,线程是cpu调度和发派的基本单位,一个进程可以创建和撤销多个线程 并发和并行 多线程程序在一个核的cpu上面运行,是并发 多线程程序在多个核的cpu上面运行,这是并行 协程和线程 协程 : 独立的栈空间,共享的堆内存,调度由用户自己控制,本质上有点类似于用户级的线程,这些用户级线程的调度是自己来实现的。 线程:一个线程可以跑多个协程。 一个简单的并发案例 这块两个协程会打印出hello和world package main import( "fmt" "time" ) func test(){ for{ fmt.Println("hello") time.Sleep(time.Second) } } func main(){ go test() for{ fmt.Println("world") time.Sleep(time.Second) } }    来源: https://www.cnblogs.com/mo3408/p/12394003.html

Go语言学习笔记(练习)

喜夏-厌秋 提交于 2020-03-02 04:34:45
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 递归实现 package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { nums := fibonacci(i) fmt.Println(nums) } } func fibonacci(num int) int { if num < 2 { return 1 } return fibonacci(num-1) + fibonacci(num-2) } 闭包实现 Go的闭包实现,摘自golang官网,闭包下次在详细介绍一下 package main import "fmt" // fib returns a function that returns // successive Fibonacci numbers. func fib() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a } } func main() { f := fib() // Function calls are evaluated

GO语言的包

北城以北 提交于 2020-03-01 20:25:37
包介绍 包(package)是多个Go源码的集合,go语言有很多 内置包,比如fmt,os,io 等。 定义包 main包是一个可执行的包,只应用程序的入口包,编译完会生成一个可执行文件。 包名可以不和文件夹的名字一样, 包名不能包含-符号 。 package 包名 可见性:名称变量以大写字母开始,包外可以调用,相当于java的public 全局变量; 函数 结构体(struct);     接口(interface) 结构体的属性; 结构体的 方法; 接口 体的 方法; 不可见: 名称变量以小写字母开始,包外可以调用,相当于java的private 函数内的 局部变量 不管是否大写包外都不可见, 如果想在一个包中引用另外一个包里的标识符(如 变量、常量、类型、函数 等)时,该标识符必须是对外可见的(public)。在Go语言中只需要将标识符的首字母大写就可以。 // 首字母小写,外部包不可见,只能在当前包内使用 var num = 10 //首字母大写外部包可见,可在其他包中使用 const Name = "ares" //全局变量 // 首字母小写,外部包不可见,只能在当前包内使用 type person struct { name string } type Student struct { //结构体 Name string //属性 class string /

golang学习的点点滴滴:异常处理 defer, panic, recover

梦想与她 提交于 2020-03-01 16:20:59
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。 例子代码: package main import "fmt" func main(){ defer func(){ // 必须要先声明defer,否则不能捕获到panic异常 fmt.Println("c") if err:=recover();err!=nil{ fmt.Println(err) // 这里的err其实就是panic传入的内容,55 } fmt.Println("d") }() f() } func f(){ fmt.Println("a") panic(55) fmt.Println("b") fmt.Println("f") } 输出结果: a c 55 d

go语言内置基础类型

我只是一个虾纸丫 提交于 2020-02-29 16:39:23
1、数值型(Number) 三种:整数型、浮点型和虚数型(有符号整数表示整数范围 -2 n-1 ~2 n-1 -1;无符号整数表示整数范围 0~2 n -1) go内置整型有:uint8, uint16, uint32, uint64, int8, int16, int32, int64。其中u开头的类型就是无符号整型 无符号类型能够表示正整数和零;而有符号类型除了表示正整数和零外,还可以表示负整数 byte类型和uint8类型一样,表示字节类型。 rune类型和int32类型一样,用来表示unicode的代码点,就是unicode字符所对应的整数 go定义了三个依赖系统的类型:uint, int和uintptr。对于32位系统uint=uint32, int=int32, uintptr为32位的指针;对于64位系统uint=uint64, int=int64, uintptr为64位的指针 go内置浮点类型有:单精度浮点型float32和双精度浮点型float64;主要区别是小数点后位数不同 go内置虚数类型有:complex64和complex128 加减乘除操作为数值类型共有;求余运算(%)是整数类型独有的。其他类型使用,编译会报错 2、字符串类型(string) 传统字符串是由字符组成,而go的字符串是由字节组成。字符串用 ` 符号类似单引号却不是单引号 或双引号来描述