go
文章平均质量分 58
csy2005csy
这个作者很懒,什么都没留下…
展开
-
关闭通道和通道上范围循环
一、 关闭通道发送者可以通过关闭信道,来通知接收方不会有更多的数据被发送到channel上。close(ch)接收者可以在接收来自通道的数据时使用额外的变量来检查通道是否已经关闭。语法结构:v, ok := <- ch 类似map操作,存储key,value键值对v,ok := map[key] //根据key从map中获取value,如果key存在, v就是对应的数据,如果key不存在,v是默认值在上面的语句中,如果ok的值是true,表示成功的从通道中.原创 2021-10-03 11:24:45 · 350 阅读 · 0 评论 -
channel通道
通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接收。在前面讲Go语言的并发时候,我们就说过,当多个Goroutine想实现共享数据的时候,虽然也提供了传统的同步机制,但是Go语言强烈建议的是使用Channel通道来实现Goroutines之间的通信。“不要通过共享内存来通信,而应该通过通信来共享内存” 这是一句风靡golang社区的经典语Go语言中,要传递某个数据给另一个goroutine(协程),可以把这个数据封装成原创 2021-10-03 11:22:30 · 21819 阅读 · 0 评论 -
sync包——读写锁
官网文档对sync包的介绍:Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channe原创 2021-10-03 11:17:11 · 472 阅读 · 0 评论 -
sync包——互斥锁
官网文档对sync包的介绍:Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channe原创 2021-10-03 11:15:24 · 251 阅读 · 0 评论 -
sync包——WaitGroup
官网文档对sync包的介绍:Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channe原创 2021-10-03 11:12:49 · 241 阅读 · 0 评论 -
临界资源安全问题
一、临界资源临界资源: 指并发环境中多个进程/线程/协程共享的资源。但是在并发编程中对临界资源的处理不当, 往往会导致数据不一致的问题。示例代码:package mainimport ( "fmt" "time")func main() { a := 1 go func() { a = 2 fmt.Println("子goroutine。。",a) }() a = 3 time.Slee原创 2021-10-03 11:10:20 · 386 阅读 · 0 评论 -
runtime包
官网文档对runtime包的介绍:Package runtime contains operations that interact with Go's runtime system, such as functions to control goroutines. It also includes the low-level type information used by the reflect package; see reflect's documentation for the progra原创 2021-10-03 11:07:51 · 365 阅读 · 0 评论 -
Go语言的并发模型
Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序。Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源。接下来我们来了解一下Go语言的并发原理。一、线程模型在现代操作系统中,线程是处理器调度和分配的基本单位,进程则作为资源拥有的基本单位。每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成。线程是进程内部的一个执行单元。 每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。 用户根据需原创 2021-10-03 10:55:47 · 557 阅读 · 0 评论 -
Go语言的协程——Goroutine
进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程)进程进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”,它是CPU资源分配和调度的独立单位。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 进程的局限是创建、撤销和切换原创 2021-10-03 09:32:37 · 2576 阅读 · 1 评论 -
并发性Concurrency
1.1 多任务什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。CPU的速度太快啦。。。1.2 什么是并发Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之前,我们首先必须了解什么是并发,以及它与并行性有什么不同。(Go is a concurrent language and not原创 2021-10-03 09:27:26 · 151 阅读 · 0 评论 -
Go的json解析:Marshal与Unmarshal
简介Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json 字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。go语言本身为我们提供了json的工具包”encoding/json”。更多的使用方式,可以参考:https://studygolang.com/articles/6742实现Json Marshal:将数据编码成json字符串看一个简单的例子ty转载 2021-09-16 14:50:28 · 1166 阅读 · 0 评论 -
go语言的值传递和指针传递
指针传递与值传递严格地说,go方法或函数只有一种传递方式,那就是值传递。每次将一个变量作为参数传递时,都会创建一个新的变量副本并将其传递给所调用的函数或方法。副本分配在不同的内存地址。在指针传递变量的情况下,将创建指向相同内存地址的新副本。为了感受它们之间的差异,我们来看看它是如何工作的。值传递package mainimport "fmt"type Person struct { firstName string lastName string}f原创 2021-09-15 10:33:44 · 3120 阅读 · 0 评论 -
基础语法(整型:uint、uint8、uint16、uint32、uint64、uintptr)
整型范围Int8 - [-128 : 127]Int16 - [-32768 : 32767]Int32 - [-2147483648 : 2147483647]Int64 - [-9223372036854775808 : 9223372036854775807]无符号整型范围UInt8 - [0 : 255]UInt16 - [0 : 65535]UInt32 - [0 : 4294967295]UInt64 - [0 : 18446744073709551615]原创 2021-09-14 16:37:14 · 7009 阅读 · 0 评论 -
Go语言指针详解
与Java和 .NET 等编程语言不同,Go语言为程序员提供了控制数据结构指针的能力,但是,并不能进行指针运算。Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这对于构建运行良好的系统是非常重要的。指针对于性能的影响不言而喻,如果你想要做系统编程、操作系统或者网络应用,指针更是不可或缺的一部分。指针(pointer)在Go语言中可以被拆分为两个核心概念:类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。 切片,由指..转载 2021-09-14 14:31:05 · 123 阅读 · 0 评论 -
go 类型转换
// atob.go ------------------------------------------------------------ // ParseBool 将字符串转换为布尔值 // 它接受真值:1, t, T, TRUE, true, True // 它接受假值:0, f, F, FALSE, false, False. // 其它任何值都返回一个错误 func ParseBool(str s..原创 2021-09-14 10:42:23 · 151 阅读 · 0 评论 -
go (type *[]int does not support indexing)
这是之前一直遇到的问题(一直没管。。。)*arr[i]如果使用这种方式想要拿到arr的第i个变量,编译器会报错,错误为题目里提示的那样正确的调用方式应该为:(*arr)[i]原创 2021-09-14 10:05:39 · 907 阅读 · 0 评论 -
Intellij idea go 快捷键是什么
快速打出for循环ctrl+j可以查看快捷生成代码的提示,可以经常看一遍,记住它们。比如itar这个,可以生成遍历数组的代码。Ctrl + Q: 显示变量类型原创 2021-09-14 09:34:25 · 265 阅读 · 0 评论 -
Go string函数与strconv.Itoa函数的区别
Itoa函数strconv.Itoa函数的参数是一个整型数字,它可以将数字转换成对应的字符串类型的数字。package mainimport ( "fmt" "strconv")func main() { string_number := 97 result := strconv.Itoa(string_number) fmt.Println(result) fmt.Printf("%T\n", result)}运行结果:...原创 2021-09-14 09:05:48 · 193 阅读 · 0 评论 -
如何使用Docker部署Go Web应用
本文介绍了如何使用Docker以及Docker Compose部署我们的 Go Web 程序。为什么需要Docker?使用docker的主要目标是容器化。也就是为你的应用程序提供一致的环境,而不依赖于它运行的主机。想象一下你是否也会遇到下面这个场景,你在本地开发了你的应用程序,它很可能有很多的依赖环境或包,甚至对依赖的具体版本都有严格的要求,当开发过程完成后,你希望将应用程序部署到web服务器。这个时候你必须确保所有依赖项都安装正确并且版本也完全相同,否则应用程序可能会崩溃并无法运行。如果你转载 2021-09-13 15:08:58 · 259 阅读 · 0 评论 -
Go语言项目部署的那些方式
部署Go语言项目本文以部署 Go Web 程序为例,介绍了在 CentOS7 服务器上部署 Go 语言程序的若干方法。独立部署Go 语言支持跨平台交叉编译,也就是说我们可以在 Windows 或 Mac 平台下编写代码,并且将代码编译成能够在 Linux amd64 服务器上运行的程序。对于简单的项目,通常我们只需要将编译后的二进制文件拷贝到服务器上,然后设置为后台守护进程运行即可。编译编译可以通过以下命令或编写 makefile 来操作。CGO_ENABLED=0 GOOS=转载 2021-09-13 15:06:36 · 767 阅读 · 0 评论 -
golang map 多协程
golang中map的三个结论:多协程同时只写入,会发生 concurrent map write 异常,必须加锁多协程同时写入读取,写入加锁,读取不加,不会异常,只是不确保读取的数据是否脏多协程同时只读取,加锁数据干净,不加锁数据可能脏package mainimport ( "fmt" "runtime" "sync")func main() { runtime.GOMAXPROCS(runtime.NumCPU()) var m = ma...原创 2021-09-13 14:58:56 · 833 阅读 · 0 评论 -
go channel
package mainimport ( "fmt" "time")func test2(a chan int, b chan int) { b <- 6 time.Sleep(time.Second) b <- 7 time.Sleep(time.Second) a <- 5}func main() { /*1.简单的channel队列现进先出特性 *在主线程上建立单个协程,完成某项工作后,关闭该管道,关闭与否为可选项。 *停止一段阻塞有两种方式.原创 2021-09-13 10:42:11 · 73 阅读 · 0 评论 -
go 学习 go-simplejson 遍历
方式一 dataJson := jsonInfo.Get("tick").Get("data") dataArr, _ := dataJson.Array() // 遍历 for i := range dataArr { info := dataJson.GetIndex(i) priceF := info.Get("price").MustFloat64() amountF := info.Get("amount").MustFloat64() direc..原创 2021-09-12 21:09:14 · 1173 阅读 · 0 评论 -
go程序部署到linux上运行
1)、下载第三方包代码git clone https://github.com/golang/sys.git一、win10上的操作1、在src目录下依次执行set CGO_ENABLED=0、set GOOS=linux、set GOARCH=amd64命令2、进入主项目目录,执行go build 程序入口文件。我这里是main.gogo build main.go二、linux 端 cento1、将程序所需要的文件如配置文件和生成的可执行文件拷贝到..原创 2021-09-12 20:46:59 · 1414 阅读 · 0 评论 -
002--- 添加 gcm
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum install python-pippip install --upgrade pippip install shadowsocksmkdir /etc/shadowsocksvi /etc/shadowsocks/shadowsocks.json添加以下内容[root@VM_0_13_centos .hulk-ma.原创 2021-09-10 14:11:47 · 1097 阅读 · 0 评论 -
idea 配置代理
原创 2021-09-09 23:31:19 · 304 阅读 · 0 评论 -
Go语言unbuffered和buffered channel
转载https://www.daehub.com/archives/9375.html初学Go 语言时,最大的挑战就是了解 Channel 的使用时机及差异。而 Channel 又分为两种,一种是 buffered channel,另一种是 unbuffered channel,本文将用几个简单的例子带大家了解这两种 channel 的差异,让初学者可以很快的了解 channel 使用方法。Unbuffered Channel在 Go 语言内使用 goroutine 是很常见的,但是我们该...转载 2021-09-09 14:16:58 · 244 阅读 · 0 评论 -
go 学习 channel
channel.gopackage mainimport ( "fmt" "time")func worker(id int, c chan int) { for n := range c { fmt.Printf("Worker %d received %c\n", id, n) }}func createWorker(id int) chan<- int { c := make(chan int) go worker(id, c) return c}原创 2021-09-09 14:00:19 · 80 阅读 · 0 评论 -
Go测试与性能调优: 使用pprof进行性能调优 graphviz
go test -bench . -cpuprofile cpu.outgo tool pprof cpu.out提示用不了,需要安装Graphviz工具.1.进入官网:http://www.graphviz.org/原创 2021-09-09 11:24:57 · 159 阅读 · 0 评论 -
go中的main函数和init函数
Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数在定义时不能有任何的参数和返回值。虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是可选的,但package main...原创 2021-09-06 10:26:23 · 201 阅读 · 0 评论 -
go 学习 错误处理
defer.gopackage mainimport ( "fmt" "os" "bufio" "imooc.com/ccmouse/learngo/functional/fib")func tryDefer() { for i := 0; i < 100; i++ { defer fmt.Println(i) if i == 30 { // Uncomment panic to see // how it works with defer //原创 2021-09-09 10:44:02 · 216 阅读 · 0 评论 -
go 学习 5
main.gopackage mainimport ( "bufio" "fmt" "io" "strings" "com.loit/learn/learngo/functional/fib")type intGen func() intfunc (g intGen) Read( p []byte) (n int, err error) { next := g() if next > 10000 { return 0, io.EOF } s := fmt.原创 2021-09-09 10:12:00 · 87 阅读 · 0 评论 -
go 学习 4 retriever
main.gopackage mainimport ( "fmt" "time" "com.loit/learn/learngo/retriever/mock" "com.loit/learn/learngo/retriever/real")type Retriever interface { Get(url string) string}type Poster interface { Post(url string, form map[string]string)原创 2021-09-09 10:09:11 · 156 阅读 · 0 评论 -
go 学习3 tree
node.gopackage treeimport "fmt"type Node struct { Value int Left, Right *Node}func (node Node) Print() { fmt.Print(node.Value, " ")}func (node *Node) SetValue(value int) { if node == nil { fmt.Println("Setting Value to nil " + "原创 2021-09-09 10:05:35 · 132 阅读 · 0 评论 -
微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现
转载:https://zhuanlan.zhihu.com/p/281090292导读:本文主要介绍如何使用 Golang 生态中的微服务框架 Go-Micro(v2) 集成 Nacos 进行服务注册与发现。(Go-Micro 目前已经是 v3 版本,但由于某些原因项目已经更名为 nitro 具体原因大家可以去 github 中查看。)相关背景知识1. Go-MicroGo Micro 是一个基于 Go 语言编写的、用于构建微服务的基础框架,提供了分布式开发所需的核心组件,包括 RPC.转载 2021-09-09 09:28:33 · 511 阅读 · 0 评论 -
解决golang被墙(go get golang.org/x/失败)
1.手动git一般在 GitHub 上都有官方的镜像仓库的对应,我们可以手动下载或 clone 对应的 GitHub 仓库到指定的目录下($GOPATH//src/golang.org/x/)。例子:cd $GOPATH/src/golang.org/x/git clone https://github.com/golang/crypto.git安装编译这个包下的所有依赖go install golang.org/x/crypto/...如:...原创 2021-09-08 15:00:46 · 977 阅读 · 0 评论 -
国内的go get问题的解决 --gopm
一、golang之旅--gopm1.什么是gopm在nodejs中我们有npm,可以通过npm来下载安装一些依赖包。在go中也开发了类似的东西,那就是gopm。这玩意儿是七牛开发的。在这里说下,七牛公司大部分程序都是用go语言编写的,所以开发出这么一个方便的东西肯定也是合情合理的。2.gopm地址git地址:https://github.com/gpmgo/gopm官方地址:https://gopm.io/gopm文档路径:https://github.com/gpmgo/docs/t原创 2021-09-08 13:39:30 · 703 阅读 · 0 评论 -
浅谈unicode编码和utf-8编码的关系
字符串编码在Python里边是经常会遇到的问题,特别是写文件以及网络传输的过程中,当调用某些函数的时候经常会遇到一些字符串编码提示错误,所以有必要弄清楚这些编码到底在搞什么鬼。 我们都知道计算机只能处理数字,文本转换为数字才能处理。计算机中8个bit作为一个字节,所以一个字节能表示最大的数字就是255。计算机是美国人发明的,而英文中涉及的编码并不多,一个字节可以表示所有字符了,所以ASCII(American national Standard Code for Infor...原创 2021-09-07 17:06:36 · 208 阅读 · 0 评论 -
1个汉字在UTF-8编码占3个字节
举一个实例。打开"记事本"程序Notepad.exe,新建一个文本文件,内容就是一个"严"字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。然后,用文本编辑软件UltraEdit中的"十六进制功能",观察该文件的内部编码方式。1)ANSI:文件的编码就是两个字节"D1 CF",这正是"严"的GB2312编码,这也暗示GB2312是采用大头方式存储的。2)Unicode:编码是四个字节"FF FE 25 4E",其中"FF FE"表.原创 2021-09-07 16:55:00 · 556 阅读 · 0 评论 -
go 学习基础2 容器
package mainimport "fmt"func printArray(arr [5]int) { arr[0] = 100 for i, v := range arr { fmt.Println(i, v) }}func main() { var arr1 [5]int arr2 := [3]int{1, 3, 5} arr3 := [...]int{2, 4, 6, 8, 10} var grid [4][5]int fmt.Println("array d.原创 2021-09-07 15:40:52 · 92 阅读 · 0 评论