golang

配置 Golang for Mac 开发环境

ぐ巨炮叔叔 提交于 2019-12-06 21:51:43
Golang 官网 : https://golang.org/ Golang 中文网 http://docscn.studygolang.com/ 下载.pkg包,像Windows一样的安装。默认安装目录 /usr/local/go 目录。并已经设置好环境变量。 打开终端,输入go evn 查看环境变量。我们会发现GOPATH环境变量为空。 建立GOPATH环境变量 把GOPATH建立在/Users/用户名/Desktop/gowork vi ~/.bash_profile 加入 export GOPAHT=/Users/用户名/Desktop/gowork 立即生效 source ~/.bash_profile 根据约定,GOPATH下需要建立3个目录: bin 存储编译后的可执行文件; pkg 存放编译后生成的包文件; src 存放项目的源码; 此事Golang的开发环境已经搭建完成。 新建hellogolang.go //hellogolang.go package main import "fmt" func main() { fmt.Println("Hello Golang!") } go run hellogolang.go 输出 Hello Golang! 来源: oschina 链接: https://my.oschina.net/u/917842/blog

[翻译] effective go 之 Blank identifier

大城市里の小女人 提交于 2019-12-06 19:28:42
Blank identifier Go defines a special identifier _, called the blank identifier . The blank identifier can be used in a declaration to avoid declaring a name, and it can be used in an assignment to discard a value. This definition makes it useful in a variety of contexts. Go中有一个特殊的标识符 _ 被成为blank identifier 它可以用来避免为某个变量起名 同时也可以在赋值时 舍弃某个值 Multiple assignment If an assignment requires multiple values on the left side, but one of the values will not be used by the program, using the blank identifier in the assignment avoids the need to create a dummy variable. We saw one example of this in the

Golang开发支持平滑升级(优雅重启)的HTTP服务

ぃ、小莉子 提交于 2019-12-06 19:27:05
前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑升级,需要以下几个步骤: 用新的可执行文件替换老的可执行文件(如只需优雅重启,可以跳过这一步) 通过pid给正在运行的老进程发送 特定的信号(kill -SIGUSR2 $pid) 正在运行的老进程,接收到指定的信号后,以子进程的方式启动新的可执行文件并开始处理新请求 老进程不再接受新的请求,等待未完成的服务处理完毕,然后正常结束 新进程在父进程退出后,会被init进程领养,并继续提供服务 二、Golang Socket 网络编程 Socket是程序员层面上对传输层协议TCP/IP的封装和应用。Golang中Socket相关的函数与结构体定义在net包中,我们从一个简单的例子来学习一下Golang Socket 网络编程,关键说明直接写在注释中。 1、服务端程序 server.go package main import ( "fmt" "log" "net" "time" ) func

Golang 301永久重定向

拟墨画扇 提交于 2019-12-06 16:30:36
比如我要把 www.taadis.com 永久重定向到 taadis.com //main.go package main import ( "log" "net/http" ) //301永久重定向 func Redirect301Handler(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "https://taadis.com", http.StatusMovedPermanently) } func main() { mux := http.NewServeMux() mux.HandleFunc("/", Redirect301Handler) err := http.ListenAndServe(":80", mux) if err != nil { log.Println(err.Error()) } } 总结 这里会有个些问题: 当服务器上有多个 golang webserver 时, 会相互占用":80"端口, 所以通用的做法还是通过 apache/nginx 来统一做301等各类重定向服务, 来源: oschina 链接: https://my.oschina.net/u/2912152/blog/840470

Golang源码探索(二) 协程的实现原理

旧街凉风 提交于 2019-12-06 15:38:37
https://www.cnblogs.com/zkweb/p/7815600.html Golang源码探索(二) 协程的实现原理 Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是 G , M 和 P , 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的轻量线程, goroutine使用 go 关键词创建. 举例来说, func main() { go other() } , 这段代码创建了两个goroutine, 一个是main, 另一个是other, 注意main本身也是一个goroutine. goroutine的新建, 休眠,

golang日常记录

馋奶兔 提交于 2019-12-06 15:30:10
golang中 map slice interface chan 传递的是指针,是因为其 实例中 存储的数据 是用的指针。 eg: slice ```` type slice struct { array unsafe.Pointer len int, cap int, } 传递的过程中也是复制的 struct 结果: 1.append不能影响原slice 2.json.Unmashal(buf, &slice)需要传入slice地址 3.一个slice占三个字节 * 赋值使用的是地址 var i int i = 1 i的类型不能变,赋其他值 I的地址也不会变,有别于动态语言 * map中的struct 不能直接修改 struct的属性 m := map[string]Student{"people": {"name":"aaa"}} m["people"].name = "bbb" 是错误的 // A header for a Go map. type hmap struct { // 元素个数,调用 len(map) 时,直接返回此值 count int flags uint8 // buckets 的对数 log_2 B uint8 // overflow 的 bucket 近似数 noverflow uint16 // 计算 key 的哈希的时候会传入哈希函数 hash0

golang思考之运行速度之channel

浪尽此生 提交于 2019-12-06 14:55:15
golang channel测速程序: package main import ( "runtime" ) var PC_DATA_SIZE int var chEnd chan int func producer(ch chan byte) { for i := 0; i < PC_DATA_SIZE; i++ { ch <- 0 } chEnd <- 0 } func consumer(ch chan byte) { for i := 0; i < PC_DATA_SIZE; i++ { <-ch } chEnd <- 0 } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) PC_DATA_SIZE = 10000000 chEnd = make(chan int) ch := make(chan byte, 1024) go producer(ch) go consumer(ch) <-chEnd <-chEnd } C语言有锁并发队列: #include <pthread.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #define PC_DATA_SIZE 10000000 typedef struct Queue{ uint8_t

Golang之旅--变量的定义和使用

ぐ巨炮叔叔 提交于 2019-12-06 12:44:04
##前言 不论学习哪种语言,都离不开常见的语法,变量的定义,方法的定义(函数的定义),类的定义,接口的定义(如果语言支持的话)等等。 #通过var定义变量 定义变量并赋值 var name = "liyang" //自动识别类型 var age = 28 var name string = "liyang" //指定数据类型 ####定义变量,但不赋值 var name string var age int ####定义多个变量 var name, address string var name, age = "liyang",28 #通过:=定义参数 使用:=只能在函数中定义参数,也就是说只能定义局部变量,无法定义全局变量。 address := "handan" 如果在函数外使用:=定义参数会报错: syntax error: non-declaration statement outside function body #全局变量&局部变量 在go中,全局变量即在函数外定义的变量,局部变量即在函数内定义的变量 局部变量如果定义了没有使用会报错:'Error: xxx declared and not used。',我们通过特殊变量名'_'来规避这个错误。 可以在不同的函数代码块中定义相同名称的变量。 常量 在java中我们通过final来指定常量

golang sync.Pool试用说明及注意事项

£可爱£侵袭症+ 提交于 2019-12-06 12:40:31
Go tip 是 Go 语言的实验分支,包含了很多尚在讨论,但很有可能会加入 stable 分支的特性。“Go tip 在做什么”(原文地址: What's happening in Go tip )分析总结了 Go 语言尚在开发中的一些重要特性。 本文译自: What's happening in Go tip (2014-01-10) 现在是 2014 年了,刚刚经历了圣诞和新年前夜,Go 团队就已经开始为下一个发布版本而工作了。也因此,“Go tip 在做什么”系列也重开了。 作为这个系列的最新一篇,这篇文章将会有些小调整。最重要的调整是,不会再遵循每周一篇文章的发布周期。一周里可能有几篇文章,也可能一篇都没有。这个调整,一部分由于个人原因,一部分也因为这样可以更灵活的追踪 Go 的改变。这样做的结果是,每篇文章可能会比以前更短,以便能紧跟最新的开发变化。 另一个调整是,将会覆盖一些关于没有变化的代码的形成原因和讨论。这是因为 Go 1.3 将会有重大改变(主要是计划用 Go 重写整个编译器),有些代码需要及早被大家了解。 这篇文章我们将会关注类型 sync.Pool 。这个类型是 Go 1.3 标准库新添加的第一个重要功能。 做了什么 添加了 sync.Pool 类型 开发流程的小改变 添加了 sync.Pool 类型 相关 CL: CL 41860043 , CL

golang几种常用配置文件使用方法总结(yaml、toml、json、xml、ini)

僤鯓⒐⒋嵵緔 提交于 2019-12-06 12:25:54
1,yaml配置文件的使用方法总结 首先介绍使用yaml配置文件, 这里使用的是github上第三方开源gopkg.in/yaml.v2 第一步:下载 go get gopkg.in/yaml.v21 第二步:新建一个yaml文件,比如conf.yaml host: localhost:3306 user: tigerwolfc pwd: 654321 dbname: tablename 特别需要强调的是冒号后面必须有一个空格,以user: tigerwolfc为例, user: tigerwolfc//冒号后面有空格 来源: https://www.cnblogs.com/sunlong88/p/11983583.html