go语言

Go语言初探

China☆狼群 提交于 2020-02-02 07:42:11
Go语言基础 规则 大写字母开头变量为共有变量,小写字母开头为私有变量(函数类似) Iota iota枚举(默认开始值为0,const中每增加一行,值加1) slice 引用类型(类似于动态数组),相比于array,它没有长度限制 make & new make返回初始化后的值(非零),只能被用于slice、map、channel new返回指针,一般很少被使用 goto(无条件跳转,配合标签使用,无条件跳转至标签,可用于跳出循环) 由于可随意跳转,在庞大的系统中不利于debug,所以在coding中会通过结构化程序设计来规避这类问题,那么,在go语言设计者为何会继续沿用goto呢? 最开始提出goto有害论主要是当时的背景导致的,最开始使用的是非结构化的过程语言,例如BASIC和各种汇编语言 可读性强,可以书写出干净的退出功能(将所有退出方式统一编辑,利用goto进行跳转) 低级性能改进,goto语句执行的非常快 defer(延迟语句,函数执行到最后会按照逆序执行defer语句,可用于处理资源泄漏问题) 在函数中使用时,采用先进后出模式 panic & recover(go没有异常机制,使用这两个内置函数来代替异常机制) 调用panic中断函数执行(但defer语句仍然会被执行),退出执行 利用recover + defer可以捕获panic的输入值,并恢复正常执行

Go语言如何判断一个chan被关闭

别来无恙 提交于 2020-02-01 20:21:18
Golang 使用Groutine和channels实现了CSP(Communicating Sequential Processes)模型,channles在goroutine的通信和同步中承担着重要的角色。在GopherCon 2017中,Golang专家Kavya深入介绍了 Go Channels 的内部机制,以及运行时调度器和内存管理系统是如何支持Channel的 以一个简单的channel应用开始,使用goroutine和channel实现一个任务队列,并行处理多个任务。 func main(){ //带缓冲的channel ch := make(chan Task, 3) //启动固定数量的worker for i := 0; i< numWorkers; i++ { go worker(ch) } //发送任务给worker hellaTasks := getTaks() for _, task := range hellaTasks { ch <- task } ... } func worker(ch chan Task){ for { //接受任务 task := <- ch process(task) } } 从上面的代码可以看出,使用golang的goroutine和channel可以很容易的实现一个生产者-消费者模式的任务队列,相比java, c+

Golang - 指针与引用

天大地大妈咪最大 提交于 2020-02-01 18:51:28
​ Golang有指针 , 那么一切数据都是值传递吗 ? 都需要用户进行指针传递吗, 其实不然, 对于Go语言, 虽然有指针, 但是其也有引用传递. 是不是很绕, 因为引用传递就是指针传递哇 . 我们继续解释. 概念 在Go语言中,对于 布尔变量 或 数值类型 或 字符串类型 或 数组 以及 struct 都是按照值传递的:值在传递给函数或者方法时会被复制一份,然后方法或函数使用的是复制的这份值,也就不会对原值产生什么影响。一般情况下,对于布尔变量或数值类型或字符串类型的按值传递是非常廉价的,Go语言编译器会在传递过程中进行安全优化。 对于大字符串是这样,对于数组进行值传递也是如此。为了解决可能产生的巨大代价,Go语言使用数组切片来代替数组的使用。传递一个切片的代价跟传递字符串差不多,无论该切片的长度或容量是多大。对切片进行复制修改操作也不会像字符串那样需要创建新的切片, 因为切片是可变的,属于引用类型 。 因此以下就是重点 : 语言中的值传递类型有:基本数据类型,数组 , struct 特点 :变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放 , 在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 , 所以他最大的好处就是不怕多线程安全性问题. 但是浪费内存 Go语言中的引用类型有:映射(map),数组切片(slice)

GO:go语言介绍

笑着哭i 提交于 2020-02-01 18:50:57
什么是go语言 Google开源 编译型语言 21世纪的C语言 go开发团队: go的特点 语法简洁 开发效率高 执行性能好 发展现状 最近新兴的行业公司一般会使用go语言作为主要开发语言 容器虚拟化等领域使用go语言 发展前景: 来源: https://www.cnblogs.com/wbyixx/p/12249401.html

Go语言 一维数组的使用

偶尔善良 提交于 2020-02-01 15:24:25
程序源码    package main import ( "fmt" // 导入 fmt 包,打印字符串是需要用到 ) func main() { // 声明 main 主函数 var a [3]int // 定义三个整数的数组 fmt.Println(a[0]) // 打印第一个元素 fmt.Println(a[len(a)-1]) //打印索引和元素 for i, v := range a { fmt.Printf("%d %d \n", i, v) } //仅打印元素 for _, v := range a { fmt.Printf("%d \n", v) } //在数组的定义中,如果在数组长度的位置出现“...”省略号,则表示数组的长度是根据初始化值的个数来计算 q := [...]int{2, 3, 5} fmt.Printf("%T \n", q) } 输出结果 来源: https://www.cnblogs.com/personblog/p/12248366.html

GO

帅比萌擦擦* 提交于 2020-02-01 15:05:12
第一次接触GO语言,java,c都还没学咋滴。又接触一个。。 Go语言运行环境搭建,下载 https://studygolang.com/dl 根据自己的系统进行下载。。 双击安装就行了,一直下一步。自动配置环境变量。然后打开cmd 输入 go version ok,来Hello World!桌面 新建文本文档后缀名改成.go hello.go package main import "fmt" func main(){ fmt.Println("Hello World!") } 运行 go run + name.go 来源: https://www.cnblogs.com/songxiaoke/p/12248416.html

Go语言基础之17--Redis基本操作

懵懂的女人 提交于 2020-02-01 09:19:16
一、介绍与连接 1.1 介绍 使用第三方的redis库, github.com/garyburd/redigo/redis github地址: https://github.com/gomodule/redigo 下载: go get github.com/garyburd/redigo 1.2 连接redis package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func initRedis() (conn redis.Conn, err error) { //连接redis函数 conn, err = redis.Dial("tcp", "127.0.0.1:6379") //传递协议、ip、端口 if err != nil { fmt.Printf("conn redis failed, err:%v\n", err) return } fmt.Printf("connect redis successful!!!\n") return } func main() { conn, err := initRedis() if err != nil { return } defer conn.Close() //关闭连接 } 执行结果: 二、redis开发 2.1 set操作 package main

Golang - 开篇必须吹牛逼

独自空忆成欢 提交于 2020-02-01 01:14:47
目录 Golang - 开篇必须吹牛逼 Go牛逼吗 安装环境 Golang - 开篇必须吹牛逼 (1)我们为什么要学 高并发 深度 || 广度 (2)go学习思路和目标 多打多练 掌握go语言 做一个并发相关的案例 Go牛逼吗 1. 认识go语言 go语言(或 Golang)是Google在 2007 年开发的一种开源编程语言,于2009年11月开源,2012年发布go稳定版 go是非常年轻的一门语言,它的主要目标是“兼具Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性 2. go的诞生 Robert:曾协助制作Java的HotSport编译器,制作了chrome浏览器的js引擎V8 Rob:google首席科学家,与ken共事多年,创出广泛实用的UTF-8编码 Ken:1966年加入贝尔实验室,1983年图灵奖和美国国家技术奖得主,是Unix的原创者,发明了衍生出C的B语言 3. go的优势 做高并发有巨大的优势 开发简单,开发效率堪比python 运行效率高,很适合用作中央服务器的系统编程语言 是项目转型的首选语言,很多公司在用go重构代码 提供了海量并行的支持,很适合处理游戏相关数据 4. 使用go的公司 Google https://github.com/kubernetes/kubernetes Facebook https://github

GO语言学习笔记(六、map)

女生的网名这么多〃 提交于 2020-01-31 05:45:34
map 类似其它语言中的哈希表或者字典,以key-value形式存储数据 Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍 Map使用make()创建,支持 := 这种简写方式 make([keyType]valueType,cap),cap表示容量,可省略 超出容量时会自动扩容,但尽量提供一个合理的初始值 使用len()获取元素个数 键值对不存在时自动添加,使用delete()删除某键值对 使用for range对map和slice进行迭代操作 多级map嵌套的情况,需要将每一级map进行单独的初始化,并且在初始化前进行检查,避免运行时错误。 map排序 来源: CSDN 作者: 老蒋的程序人生 链接: https://blog.csdn.net/peraglobal/article/details/104112717

go语言 base58编码解码

痞子三分冷 提交于 2020-01-30 00:19:19
package main import ( "bytes" "encoding/hex" "fmt" "math/big" ) var base58Alphabets = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") func main() { // testReverse() str := "a" _, res := Base58Encode([]byte(str)) fmt.Println("res=", res) resByte, resStr := Base58Decode([]byte(res)) fmt.Println("resByte=", resByte) fmt.Println("resStr=", resStr) } // Base58Encode 编码 func Base58Encode(input []byte) ([]byte, string) { x := big.NewInt(0).SetBytes(input) fmt.Println("x=", x) base := big.NewInt(58) zero := big.NewInt(0) mod := &big.Int{} var result []byte // 被除数/除数=商……余数 fmt