golang

golang中os/exec包用法

自闭症网瘾萝莉.ら 提交于 2020-01-13 06:23:58
exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o. 1.func LookPath(file string) (string, error) 在环境变量PATH指定的目录中搜索可执行文件,如file中有斜杠,则只在当前目录搜索。返回完整路径或者相对于当前目录的一个相对路径。 [root@myserver01 http]# vim os.go package main import( "os/exec" "fmt" "os" ) func main(){ f,err := exec.LookPath("yum") if err != nil{ fmt.Println(err) os.Exit(1) } fmt.Println(f) } [root@myserver01 http]# go build os.go [root@myserver01 http]# ./os /usr/bin/yum 来源: https://www.cnblogs.com/vijayfly/p/6102470.html

【go】golang中置new()函数和make()函数的区别

痞子三分冷 提交于 2020-01-13 03:29:02
Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives),其功能相似,却有本质区别。 1、new 官方文档 // The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type. func new(Type) *Type 翻译如下: 内建函数 new 用来分配内存,第一个参数是一个类型,不是一个值,返回值是一个指向分配零值的指针 new和其他语言中的同名函数一样,new(t)分配了零值填充的类型为T内存空间,并且返回其地址,即一个*t类型的值。 返回的永远是类型的指针,指向分配类型的内存地址 它并不初始化内存,只是将其置零。*t指向的内容的值为零(zero value)。注意并不是指针为零。 2、make 官方文档 //The make built-in function allocates and initializes an object //of type slice, map, or chan (only). Like new, the

golang中的CSP并发模型

痴心易碎 提交于 2020-01-13 02:19:29
1. 相关概念:   用户态:当一个进程在执行用户自己的代码时处于用户运行态(用户态)   内核态:当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),引入内核态防止用户态的程序随意的操作内核地址空间,具有一定的安全保护作用。这种保护模式是通过内存页表操作等机制,保证进程间的地址空间不会相互冲突,一个进程的操作不会修改另一个进程地址空间中的数据。   用户态与内核态之间的切换:当在系统中执行一个程序时,大部分时间都是运行在用户态下的,在其需要操作系统帮助完成一些用户态自己没有特权和能力完成的操作时就会切换到内核态。有以下三种方式:   (1)系统调用(中断)     用户态进程主动要求切换到内核态的一种方式。   (2)异常     cpu运行时如果发生一些没有预知的异常,会触发当前进程切换到处理此异常的内核相关进程中。   (3)外围设备的中断     用户态进程主动要求切换到内核态的一种方式。   协程:又称微线程,纤程。英文名Coroutine。Coroutine是一种运行在用户态的用户线程,类似于 greenthread。协程与线程都相互独立,且有自己的上下文,不同之处在于,协程的切换由其自身控制,而线程的切换收到系统调度。 2. CSP (通信顺序进程)   CSP模型用来描述两个独立的并发实体通过共享的通讯channel管道进行通信的并发模型。  

[Journey with golang] 4. Interface

只愿长相守 提交于 2020-01-13 00:26:42
golang的接口与我已有的认知不太一样,这篇文章要写好一阵子。 接口是一个编程规约,也是一组方法签名的集合。golang的接口是非侵入式的设计,也就是说,一个具体类型实现接口不需要再语法上显式地声明,只要具体类型的方法集是接口方法集的超集,就代表该类型实现了该接口,编译器在编译时会进行方法集的校验。接口是没有具体实现逻辑的,也不能定义字段。 接口变量只有值和类型的概念,所以接口类型变量仍然称为接口变量,接口内部存放的具体类型变量被称为接口指向的“实例”。接口只有声明没有实现,所以定义一个新接口,通常又变成声明一个新接口,二者通用,意思相同。 最常使用的接口字面量类型就是空接口 interface {} ,由于空接口的方法集为空,所以任意类型都被认为实现了空接口,任意类型的实例都可以赋值或传递给空接口,包括未命名类型的实例。注意:未命名类型由于不能定义自己的方法,所以方法集为空,因此其类型变量除了传递给空接口,不能传递给任何其他接口。 golang的接口分为接口字面量类型和接口命名类型,接口声明使用 interface 关键字。接口字面量类型声明语法如下所示: 1 interface{ 2 MethodSignature_1 3 MethodSignature_2 4 } 接口命名类型使用 type 关键字声明,语法如下所示: 1 type InterfaceName

golang删除数组某个元素

怎甘沉沦 提交于 2020-01-13 00:06:10
golang中对一个slice进行“slice”可以取片段得到一个新的slice,那么如何用简洁的代码删除slice中的一个元素呢? a := []int{0, 1, 2, 3, 4} //删除第i个元素 i := 2 a = append(a[:i], a[i+1:]...) 作者:krystollia 链接:https://www.jianshu.com/p/bfde71cac827 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 来源: https://www.cnblogs.com/ExMan/p/12185346.html

Golang写的程序注入一些版本信息,Debug速度自然快几倍!

旧城冷巷雨未停 提交于 2020-01-12 22:21:23
背景 Go程序运行时打印git提交信息编译信息 Golang编译信息注入程序 当在debug的过程中,我们需要明确当前运行的go程序是什么版本 不要浪费时间在确认版本的问题上 在go build编译的时候是可以注入外部参数的 让go程序在运行的时候就可以打印编译时候的参数情况 以gitlab-runner为例 gitlab-runner -v Version: 11.10.1 Git revision: 1f513601 Git branch: 11-10-stable GO version: go1.8.7 Built: 2019-04-24T09:29:18+0000 OS/Arch: linux/amd64 最终实现的go程序运行时终端打印的信息如下 App Name: app-api App Version: v2.0.1 Build version: 84d4ffb verdor Build time: 2019-08-06T09:58:48+0800 Git revision: 84d4ffb Git branch: master Golang Version: go version go1.12.2 linux/amd64 2019-07-24 10:53:34.732 11516: http server started listening on [:20000]

golang并发

旧街凉风 提交于 2020-01-12 13:03:05
golang中提供了goroutine,即所谓的协程编程。这里面有几个概念需要区分一下 (by 魏加恩 本文地址http://www.cnblogs.com/weijiaen/p/3970856.html) 1. 并发&并行 简单一句话,并发是n个事情同时发生,但是不是同时刻发生。that is, parallelism means one or more things happen at the same time, while concurrency alows things happen together in a specific time. 并发其实是指程序的几个逻辑流在一起进行,但是,某个时刻也许只执行其中的某个逻辑流。这取决于cpu是否多核。我们知道,一个cpu核在一个时间只能执行一个指令,但是多个核就可以执行多个指令,即所谓的并行。所以,并发是并行的必要条件,不是充分条件。 2. 协程&线程 golang的协程由多牛逼,可以创建多少个就不去说了,为什么呢,因为goroutine的消耗低。成本低的事情自然容易做。   开启一个进程的消耗是很高的,需要分配单独的堆栈,为每个进程分配一个进程控制块,供操作系统进行调度。 开启线程的消耗次之,需要分配单独的栈,但是堆是共享的,所以需要自己保证堆变量的并发访问问题竞争问题。(所以,不是操作系统忙就是码农忙!) 开启协程的消耗

golang之数组

Deadly 提交于 2020-01-12 11:44:13
一、数组的含义 数组是一种集合,数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。 数组由数组元素类型和数组长度组成。 1、数组长度或容量。可以由内置的函数获得,len和cap。 2、数组元素的类型。数组存放的数据类型,可以存放数值、字符串、结构体、函数、接口、管道等数据类型。 3、数组元素的值。可以修改和查找元素的值。 二、数组变量的定义 1、默认初始化。var a [16]int 2、顺序初始化。 var a [6]int = [6]int{1,2,3,4,5,6} 或者 [...]int{1,2,3,4,5,6} var a = [6]int{1,2,3,4,5,6} 或者 [...]int{1,2,3,4,5,6} a := [6]int{1,2,3,4,5,6} 或者 [...]int{1,2,3,4,5,6} 3、索引初始化。 var a [6]int = [6]int{2:9,5:45,1:32} 或者 [...]int{2:9,5:45,1:32} var a = [6]int{2:9,5:45,1:32} 或者 [...]int{2:9,5:45,1:32} a := [6]int{2:9,5:45,1:32} 或者 [...]int{2:9,5:45,1:32} 4、混合初始化。 var a [6]int = [6]int{1,2

golang常用的http请求操作

戏子无情 提交于 2020-01-12 04:37:37
之前用python写各种网络请求的时候写的非常顺手,但是当打算用golang写的时候才发现相对来说还是python的那种方式用的更加顺手,习惯golang的用法之后也就差别不大了,下面主要整理了常用的通过golang发起的GET请求以及POST请求的代码例子 golang发起GET请求 基本的GET请求 //基本的GET请求 package main import ( "fmt" "io/ioutil" "net/http" ) func main() { resp, err := http.Get("http://httpbin.org/get") if err != nil { fmt.Println(err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) fmt.Println(resp.StatusCode) if resp.StatusCode == 200 { fmt.Println("ok") } } 带参数的Get请求 package main import ( "fmt" "io/ioutil" "net/http" ) func main(){ resp, err := http.Get("http:/

使用 Docker 镜像构建 GO 语言环境

我的梦境 提交于 2020-01-11 22:15:28
1. 安装 Docker 我当前使用的系统环境是 CentOS7 ,安装 Docker 使用的命令是 yum install docker* 。至于其它系统,可以到百度查找其对应的安装方式。 2. 配置 Docker 镜像仓库的地址 目前来说,直接访问 Docker 官网的 DockerHub 会比较慢, 不过幸好现在国内出现了一些 DockerHub 的加速网站。 下面使用 ustc 加速器。 修改文件 /etc/docker/daemon.json,将其内容修改为 { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } 配置完成后,重启 Docker 服务:systemctl restart docker 这样就可以使用 https://docker.mirrors.ustc.edu.cn 加速器了。 如果 ustc 的加速器速度不够快,还可以尝试一下其它的加速器,具体请参考这里 Docker 镜像加速器 3. 下载 golang 的 Docker 镜像 现在就可以下载 golang 的 Docker 镜像了。 在命令行执行命令 docker search golang 就可以查询 golang 镜像的信息了。 $ docker search golang INDEX NAME DESCRIPTION