golang

golang语言初体验

半世苍凉 提交于 2020-03-10 11:06:25
Go (又称 Golang )是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种 静态 强类型 、 编译型语言 。Go 语言语法与 C 相近,但功能上有:内存安全, GC (垃圾回收), 结构形态 及 CSP-style 并发计算 。 简介 Go (又称 Golang )是 Google 开发的一种 静态 强类型 、编译型、并发型,并具有垃圾回收功能的 编程语言 。 罗伯特·格瑞史莫(Robert Griesemer),罗勃·派克(Rob Pike)及 肯·汤普逊 (Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于 Inferno 操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在 Linux 及 Mac OS X 平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。 [1] 描述 Go的语法接近 C语言 ,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以 东尼·霍尔 的 通信顺序进程 (CSP)为基础,采取类似模型的其他语言包括 Occam

Golang解决TCP粘包拆包问题

大兔子大兔子 提交于 2020-03-08 22:03:38
什么是粘包问题 最近在使用Golang编写Socket层,发现有时候接收端会一次读到多个数据包的问题。于是通过查阅资料,发现这个就是传说中的TCP粘包问题。下面通过编写代码来重现这个问题: 服务端代码 server/main.go func main ( ) { l , err := net . Listen ( "tcp" , ":4044" ) if err != nil { panic ( err ) } fmt . Println ( "listen to 4044" ) for { // 监听到新的连接,创建新的 goroutine 交给 handleConn函数 处理 conn , err := l . Accept ( ) if err != nil { fmt . Println ( "conn err:" , err ) } else { go handleConn ( conn ) } } } func handleConn ( conn net . Conn ) { defer conn . Close ( ) defer fmt . Println ( "关闭" ) fmt . Println ( "新连接:" , conn . RemoteAddr ( ) ) result := bytes . NewBuffer ( nil ) var buf [

深入golang之---goroutine并发控制与通信

*爱你&永不变心* 提交于 2020-03-08 11:49:42
深入golang之—goroutine并发控制与通信 开发go程序的时候,时常需要使用goroutine并发处理任务,有时候这些goroutine是相互独立的,而有的时候,多个goroutine之间常常是需要同步与通信的。另一种情况,主goroutine需要控制它所属的子goroutine,总结起来,实现多个goroutine间的同步与通信大致有: - 全局共享变量 - channel通信(CSP模型) - Context包 本文章通过goroutine同步与通信的一个典型场景-通知子goroutine退出运行,来深入讲解下golang的控制并发。 通知多个子goroutine退出运行 goroutine作为go语言的并发利器,不仅性能强劲而且使用方便:只需要一个关键字go即可将普通函数并发执行,且goroutine占用内存极小(一个goroutine只占2KB的内存),所以开发go程序的时候很多开发者常常会使用这个并发工具,独立的并发任务比较简单,只需要用go关键字修饰函数就可以启用一个goroutine直接运行;但是,实际的并发场景常常是需要进行协程间的同步与通信,以及精确控制子goroutine开始和结束,其中一个典型场景就是主进程通知名下所有子goroutine优雅退出运行。 由于goroutine的退出机制设计是,goroutine退出只能由本身控制

golang中的变量、常量

╄→尐↘猪︶ㄣ 提交于 2020-03-08 09:41:23
golang中的变量、常量 变量、常量 1.变量:提高代码的可读性 2.变量类型:如字符串、浮点型、整型等 4.变量的声明方式:单独声明;批量声明;类型推导;短变量声明 示例: package main import "fmt" var m int //单个声明 var p = 1 //类型推导 var ( n int s string b bool f float64 ) //批量声明 func main ( ) { n1 := 1 //短变量声明(必须使用) fmt . Println ( n1 ) } //运行结果 // 1 3.变量初始化:当声明了变量,这个变量就已经有了内存地址,值为类型的零值 示例: package main import "fmt" var m int func main ( ) { fmt . Printf ( "type:%T\nm:%d\np:%p\n" , m , m , & m ) //获取m的类型,值,内存地址(指针) } //运行结果 //type:int //m:0 //p:0x596b00 5.匿名变量:想要忽略,或者不使用这个值时,可以使用匿名变量,使用 _ 表示 示例 package main import "fmt" func main ( ) { n := [ ... ] int { 1 , 2 , 3 , 4 , 5 } /

golang中的rpc包用法

与世无争的帅哥 提交于 2020-03-08 02:32:22
什么是 RPC 框架 ?   RPC(Remote Procedure Call)— 远程过程调用 ,它是一种通过 网络 从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 RPC协议 假定某些 传输协议 的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI 网络通信 模型中,RPC跨越了 传输层 和 应用层 。RPC使得开发包括网络 分布式 多程序在内的应用程序更加容易。   RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复 信息 ,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。 什么是 Goridge?   Goridge是高性能的PHP到Golang编解码器库,它可以通过本地PHP套接字和Golang net / rpc包进行工作。 该库允许您以最小的占用空间,结构和[]字节支持从PHP调用Go服务方法。 (1)测试说明: 操作系统:Linux PHP版本:php7.2 Golang版本:1.10 PHP框架:TP5(直接composer加载就可以使用了) (2)安装说明: 1、spiral

golang runtime 简析

不打扰是莪最后的温柔 提交于 2020-03-07 05:22:54
Go Runtime 的总览 golang 的 runtime 在 golang 中的地位类似于 Java 的虚拟机,不过 go runtime 不是虚拟机. golang 程序生成可执行文件在指定平台上即可运行,效率很高, 它和 c/c++ 一样编译出来的是二进制可执行文件. 我们知道运行 golang 的程序并不需要主机安装有类似 Java 虚拟机之类的东西,那是因为在编译时,golang 会将 runtime 部分代码链接进去. golang 的 runtime 核心功能包括以下内容: 协程(goroutine)调度(并发调度模型) 垃圾回收(GC) 内存分配 使得 golang 可以支持如 pprof、trace、race 的检测 支持 golang 的内置类型 channel、map、slice、string等的实现 等等 下图 1 是 golang 程序、runtime、可执行文件与操作系统之间的关系. 区别于 Java 需要安装虚拟机,go 语言的可执行文件已经包含了 golang 的 runtime,它为用户的 go 程序提供协程调度、内存分配、垃圾回收等功能.此外还会与系统内核进行交互,从而真正的利用好 CPU 等资源. 本文主要简单介绍 golang runtime 的并发调度模型、垃圾回收与内存分配. 协程调度模型 调度是操作系统的核心功能了,从计算机诞生以来

leetcode刷题笔记(Golang)--328. Odd Even Linked List

不打扰是莪最后的温柔 提交于 2020-03-07 01:29:15
Odd Even Linked List Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes. You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity. Example 1: Input: 1->2->3->4->5->NULL Output: 1->3->5->2->4->NULL Example 2: Input: 2->1->3->5->6->4->7->NULL Output: 2->3->6->7->1->5->4->NULL Note: The relative order inside both the even and odd groups should remain as it was in the input. The first node is considered odd, the second node

罗马数字转整数的golang实现

百般思念 提交于 2020-03-06 14:25:58
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。 输入: "III" 输出: 3 输入: "IV" 输出: 4 输入: "IX" 输出: 9 输入: "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3. 输入: "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV =

cobra golang好用的CLI工具

孤人 提交于 2020-03-06 12:47:18
Cobra 每个好的开源项目都会有很多好用的开源库的诞生,之前学openstack的时候就对openstack的oslo系列工具组用的非常多,现在学习k8s后发现同样在go下也有很多类似的开源库,比如Cobra 就是一个用来创建命令行的 golang 库,同时也是一个用于生成应用和命令行文件的程序, 包括docker,k8s 都用的类似方式去实现,用于实现CLI非常好用,我的理解他有点类似openstack里的oslo.config。 概念: Cobra 结构由三部分组成:命令 (commands)、参数 (arguments)、标志 (flags)。基本模型如下 比如git的命令或者kube-scheduler命令: #git git clone url --bare # kube-scheduler kube-scheduler --address=127.0.0.1 --leader-elect=true --kubeconfig=/etc/kubernetes/scheduler.conf git :根命令 clone: 子命令 url: 参数args –bare : flag,用于修饰这条命令的一些描述或者约束 安装 安装前请指定后$GOBIN路径,不然安装会失败 go get -v github.com/spf13/cobra/cobra PS

golang环境protocol buffer的安装

前提是你 提交于 2020-03-06 10:40:25
怎么在go语言中使用google protocol Buffer呢? 1、下载相应的proto版本:https://github.com/google/protobuf/releases 2、把bin下的protoc文件 copy到GOPATH目录和/usr/local/bin目录里 3、下载protoc-gen-go插件:https://github.com/golang/protobuf/ 4、把上述文件拷贝到GOPATH路径下 5、cd到protobuf下执行make 6、到GOPATH目录下的bin目录中找到可执行文件protoc-gen-go,拷贝到/usr/local/bin里 7、编写protobuf文件,执行编译命令protoc --go_out=. xxx.proto 来源: https://www.cnblogs.com/zhenxing1114/p/5950485.html