golang

golang学习之旅:官方文档汇总

走远了吗. 提交于 2019-12-18 15:11:17
The Go Programming Language Specification: http://localhost:8080/ref/spec 学习Constants、Variables、Types、Declarations、Built-in functions Effective Go http://localhost:8080/doc/effective_go.html 学习Data、Concurrency,Data部分讲解了make和new的区别 The Go Memory Model http://localhost:8080/ref/mem Go Slices: usage and internals http://localhost:8080/blog/go-slices-usage-and-internals The Go Blog http://localhost:8080/blog/index 里面有很多专项博文 FAQ http://localhost:8080/doc/faq 里面是一些常见的问题,有参考价值 备注:查看文档前,先开启godoc服务器,如下: C:\Users\michael>godoc -http=:8080 来源: https://www.cnblogs.com/tsiangleo/p/4477025.html

从零搭建基于golang的个人博客网站

安稳与你 提交于 2019-12-18 13:16:46
原文链接 : http://www.bugclosed.com/post/14 从零搭建个人博客网站需要包括云服务器(虚拟主机),域名,程序环境,博客程序等方面。 本博客 就是通过这几个环节建立起来的,下面总结梳理一下环节的具体过程。 云服务器 博客程序需要有一个服务器部署和运行,所以首先需要选购一个云服务器。阿里云是国内最大的云厂商,简单起见直接选购阿里云的入门级ECS(1核,1G内存,1M固定带宽,20G SSD磁盘)。初始化主机选择centos7.2系统,可同时在后台初始化的时候设置好root初始密码。 需要注意的是,该级别的ECS是属于弹性网络,即公网IP和ECS是分离的,在ECS上 ifconfig并不能看到公网IP,只能看到内网IP;阿里云会通过自己内网的路由功能将阿里云后台上看到的公网IP映射到具体的ECS上,所以在这样的机器上部署程序是不能绑定公网IP的,程序只能绑定内网IP。当然也可以选购的时候选择阿里云的经典网络,保持主机公网和内网IP都是绑定在ECS上,不过价格会稍微贵一点。 域名 有了云服务器之后,就有一个地方可以部署博客程序,也有了一个公网IP可以访问到这个机器,但是不能每次访问都输入晦涩难记的IP来进行,需要一个方便易用的域名来代替。域名可以通过 万网 (已经被并入了阿里), godaddy 等域名服务商购买。 我选择在godaddy上购买

golang goroutine的调度

℡╲_俬逩灬. 提交于 2019-12-18 09:12:22
golang goroutine的调度 1、什么是协程? 协程是一种用户态的轻量级线程。 2、进程、线程、协程的关系和区别: * 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 * 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 * 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。 * 协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能。 * 执行协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。 goroutine就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈。所以它非常廉价,我们可以很轻松的创建上万个goroutine,但它们并不是被操作系统所调度执行。 runtime。GOMAXPROCS(runtime。NumCPU()) // go version>=1.5的时候,GOMAXPROCS的默认值就是go程序启动时可见的操作系统认为的CPU个数。 注意:在go程序中使用的操作系统线程数量包括:正服务于cgo calls的线程,阻塞于操作系统calls的线程,所以go程序中使用的操作系统线程数量可能大于GOMAXPROCS的值。 3、调度 要理解协程的实现,首先需要了解go中的三个非常重要的概念,它们分别是G(goroutine)、M

kubernetes代码阅读-apiserver基础篇

僤鯓⒐⒋嵵緔 提交于 2019-12-17 23:31:53
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> apiserver是整个kubernetes的核心模块,做的事情多,代码量也较大。市面上已经有不少apiserver代码解读的文章了,但问题在于,由于k8s的代码变化很快,想写一篇长久能用的未必能做到。所以,我参照了《Kubernetes权威指南》和浙大SEL实验室的一些文章,先把我看到的东西记下来,待后观是否有用。 kubernetes源代码版本1.2.0 代码阅读方法 先简单讲讲整个代码的目录结构 目录 说明 api 输出接口文档用 build 构建脚本 cluster 适配不同I层的云,例如亚马逊AWS,微软Azure,谷歌GCE的集群启动脚本 cmd 所有的二进制可执行文件入口代码,例如apiserver/scheduler/kubelet contrib 项目贡献者 docs 文档,包括了用户文档、管理员文档、设计、新功能提议 example 使用案例 Godeps 项目中依赖使用的Go第三方包,例如docker客户端SDK,rest等 hack 工具箱,各种编译、构建、测试、校验的脚本都在这里面 hooks git提交前后触发的脚本 pkg 项目代码主目录,cmd的只是个入口,这里是所有的具体实现 plugin 插件,k8s认为调度器是插件的一部分,所以调度器的代码在这里 release

Golang并发原理及GPM调度策略(一)

风格不统一 提交于 2019-12-17 21:27:44
其实从一开始了解到go的goroutine概念就应该想到,其实go应该就是在内核级线程的基础上做了一层逻辑上的虚拟线程(用户级线程)+ 线程调度系统,如此分析以后,goroutine也就不再那么神秘了。 并发≠并行 假如我们有一段CPU密集型任务,我们创建2000个gorountine是否真的可以将其性能提高2000倍,答案必然是不能,因为我们只是进行了2000次的并发(concurrency),而并没有真正做到并行(parallelism)。 并发其实所指的是我们的程序执行逻辑,传统单线程应用的程序逻辑是顺序执行的,在任何时刻,程序只能处理同一个逻辑,而并发指的是,我们同时执行多个独立的程序逻辑,若干个程序逻辑在执行时可以是同时进行的(但并不代表同时进行处理)。实际上,不论我们并发多少个程序逻辑,若我们仅仅将其运行在一个单核单线程的CPU上,都不能让你的程序在性能上有所提升,因为最终所有任务都排队等待CPU资源(时间片)。 而并行才能让我们的程序真正的同时处理多个任务,但并行并不是编程语言能够带我们的特性,他需要硬件支持。上面说到单核CPU所有资源都要等待同一个CPU的资源,那么其实我们只要将CPU增多就能真正的让我们实现并行。我们可以使用多核CPU或用多台服务器组成服务集群,均可实现真正的并行,能够并行处理的任务数量也就是我们的CPU数量。 引用Rob Pikie大神在PPT《

golang 使用 protobuf 的教程

孤人 提交于 2019-12-17 20:05:29
1、下载protobuf的编译器protoc 地址: https://github.com/google/protobuf/releases window: 下载: protoc-3.3.0-win32.zip 解压,把bin目录下的protoc.exe复制到GOPATH/bin下,GOPATH/bin加入环境变量。 当然也可放在其他目录,需加入环境变量,能让系统找到protoc.exe linux: 下载:protoc-3.3.0-linux-x86_64.zip 或 protoc-3.3.0-linux-x86_32.zip 解压,把bin目录下的protoc复制到GOPATH/bin下,GOPATH/bin加入环境变量。 如果喜欢编译安装的,也可下载源码自行安装,最后将可执行文件加入环境变量。 2、获取protobuf的编译器插件protoc-gen-go 进入GOPATH目录 运行 > go get -u github.com/golang/protobuf/protoc-gen-go 如果成功,会在GOPATH/bin下生成protoc-gen-go.exe文件 3、创建一个test.proto文件 //指定版本 //注意proto3与proto2的写法有些不同 syntax = "proto3"; //包名,通过protoc生成时go文件时 package test;

Golang/Go语言/Go IDE/Go windows环境搭建/Go自动提示编译器/GoSublime

只谈情不闲聊 提交于 2019-12-17 05:30:54
Go是Google开发的一种编译型,并发型,并具有垃圾回收功能的编程语言。   罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,Go语言是基于Inferno操作系统所开发的。Go语言于2009年11月正式宣布推出,并在Linux及Mac OS X平台上进行了实现.  GO语言吉祥物,很可爱吧。 Go语言的hello world!代码: [java] view plain copy print ? package main import "fmt" func main() { fmt.Println( "Hello, 世界") } package main import "fmt" func main() { fmt.Println("Hello, 世界") } 接下来为大家带来,Go开发环境的安装。   首先是 安装Go ,这里有很详细的安装说明, http://code.google.com/p/golang-china/wiki/Install 或者 http://golang.org/doc/install 下面我们在window下面安装,google有提供win安装包,对于新手还是非常简单的! https://code.google.com/p/go/downloads/list 直接下一步.

GO开发[一]:golang语言初探

前提是你 提交于 2019-12-17 00:55:31
一.Golang的安装 1.https://dl.gocn.io/ (国内下载地址)    2.https://golang.org/dl/ (国外下载地址) 3.现在studygolang中文网也可以了https://studygolang.com/dl 下载版本: mac darwin-adm64.tar.gz linux amd64.tar.gz windows amd64.msi 4.window编辑器 atom配合go-plus插件 sublime配合gosublime插件; emacs + spacemacs配置(相对来说比较麻烦,也是mac的一个不错的选择.) Goland JetBrains   直接安装的效果:   Windows推荐goland 二 、Ubuntu安装 apt install golang-go root@greg:# go env GOARCH="amd64" GOBIN="" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOOS="linux" GOPATH="" GORACE="" GOROOT="/usr/lib/go-1.7" GOTOOLDIR="/usr/lib/go-1.7/pkg/tool/linux_amd64" CC="gcc" GOGCCFLAGS="-fPIC -m64

Golang中实现PHP的Addslashes和Stripslashes

人盡茶涼 提交于 2019-12-16 16:11:44
package main // addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 // 预定义字符是: // 单引号(') // 双引号(") // 反斜杠(\) func Addslashes(str string) string { tmpRune := []rune{} strRune := []rune(str) for _, ch := range strRune { switch ch { case []rune{'\\'}[0], []rune{'"'}[0], []rune{'\''}[0]: tmpRune = append(tmpRune, []rune{'\\'}[0]) tmpRune = append(tmpRune, ch) default: tmpRune = append(tmpRune, ch) } } return string(tmpRune) } // stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。 func Stripslashes(str string) string { dstRune := []rune{} strRune := []rune(str) strLenth := len(strRune) for i := 0; i < strLenth; i++ { if

golang redis(一)

冷暖自知 提交于 2019-12-16 05:20:41
redis安装: https://blog.csdn.net/weixin_40165163/article/details/103184001 redis监控: https://blog.csdn.net/weixin_40165163/article/details/103205330 golang驱动: github.com/garyburd/redigo/redis GitHub: https://github.com/zhumengyifang/GoRedisDemo redis连接: /** 创建redis连接有密码传入密码即可无密码传入空字符串 */ func CreateConn(protocolType string, redisAddress string, password string) (redis.Conn, error) { var conn redis.Conn var err error if password == "" { conn, err = redis.Dial(protocolType, redisAddress) } else { conn, err = redis.Dial(protocolType, redisAddress, redis.DialPassword(password)) } if err != nil {