golang

[golang] 数据结构-快速排序

落花浮王杯 提交于 2020-02-26 05:05:15
快速排序是个非常经典、高效、常用的排序算法。很多语言标准库里的排序算法都有用到它。 原理 快排原理其实比较简单,就是将原本很大的数组拆成小数组去解决问题。 要拆就得找个拆的位置。如果吧这个位置称为支点,那么快速排序问题就变成了不断的去找到拆分的支点元素位置。 通常找支点就是以某个元素为标准,通过交换元素位置把所有小于标准的元素都移到一侧,大于的移到另外一侧。移动元素的逻辑就是分别从最右侧元素向左找到比指定元素小的位置,再从最左侧开始向右找比指定元素大的位置。如果两个位置不相同就交换两个位置,在继续分表从两头相向寻找。找到合适的位置就是我们需要的支点。支点两边的元素再各自重复上面的操作,直到分拆出来的子数组只剩一个元素。分拆结束,顺序也就拍好了。 那么问题来了,以哪个元素为标准去比较呢?比如可以选第一个元素。 复杂度 理想情况下找到的支点可以把数组拆分成左右长度相近的子数组,此时时间复杂度为O(n*logn) 而最差情况则是每次找到的支点元素都在某一次,导致另一侧完全浪费,寻找支点的过程也浪费。这个时候用时会达到O(n^2)。 由于会打乱相同元素原有的顺序,所以快排也是一个不稳定排序。所以常用在普通类型数据的排序中。 代码实现 package main import ( "time" "fmt" "math/rand" ) func main() { var length = 10

Golang构建HTTP服务(一)--- net/http库源码笔记

混江龙づ霸主 提交于 2020-02-26 04:53:20
搭建一个简单的Go Web服务器 Go语言标准库 - net/http 在学习Go语言有一个很好的起点, Go语言官方文档 很详细,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方提供的 标准库 net/http,通过http包提供了HTTP客户端和服务端的实现。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。如果对http概念不是太清楚的朋友可以自行google。 http包建立Web服务器 package main import ( "fmt" "net/http" "strings" "log" ) func sayhelloName(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的 fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息 fmt.Println("path", r.URL.Path) fmt.Println("scheme", r.URL.Scheme) fmt.Println(r.Form["url_long"]) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("val:", strings.Join(v, "

golang import all 类似python import * 效果

倖福魔咒の 提交于 2020-02-26 04:40:04
import "io/ioutil" func main() { content, err = iotuil.ReadFile("somefile.txt") // etc.. } =》 I guess this doesn't really answer your question, but if you want, you can actually call the methods without explicitly stating the package - just import with a . in front of the names (but this is not recommended; see below): package main import ( . "fmt" . "io/ioutil" ) func main () { content, err := ReadFile("testfile") if err != nil { Println("Errors") } Println("My file:\n", string(content)) } Note @jimt's comment below - this practice is not advised outside of tests as it could cause name

golang 简单的读负责均衡

不想你离开。 提交于 2020-02-26 02:04:12
read-loadbalance master-slave(n) 读库集群负载均衡器(简单轮询)+时间间隔错峰。 github 地址: https://github.com/Plen-wang/read-loadbalance 使用场景 1.一般我们会有多个从库,需要在从库的读取上做负载均衡。 2.在数仓拉取数据的时候经常对产线DB造成影响,所以会独立一个从库专门用来拉取,但是这个从库的利用率非常低。 数仓拉取数据一般在业务低峰期进行,iops峰值较高,但是持续时间很短。我们可以错开这个时间段,让这台从库的利用率最大化。 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/gocraft/dbr" "github.com/read-loadbalance/lb" "log" ) var slaveLB *lb.SlaveLoadBalancer func main() { //构造数据源 creator := func() *sql.DB { dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&autocommit=1", "root", 123456, "localhost", 3306, "test",

golang实现选择排序算法

冷暖自知 提交于 2020-02-26 00:55:41
package alg //选择排序 func Selection(arr []int) []int { len := len(arr) tmp := 0 if len <= 1 { return arr } for i := 0; i < len; i++ { minInt := i //最小值下标 for j := i + 1; j < len; j++ { if arr[j] < arr[minInt] { minInt = j //交换下标 } } //交换值 tmp = arr[minInt] arr[minInt] = arr[i] arr[i] = tmp } return arr } 来源: oschina 链接: https://my.oschina.net/hackdebug/blog/3158598

golang通过ssh实现远程文件传输

不问归期 提交于 2020-02-24 23:13:46
使用ssh远程操作文件, 主要是创建ssh, 直接上代码 import ( "fmt" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "net" "strconv" "time")func SftpConnect(user, password, host string, port int) (sftpClient *sftp.Client, err error) { //参数: 远程服务器用户名, 密码, ip, 端口 auth := make([]ssh.AuthMethod, 0) auth = append(auth, ssh.Password(password)) clientConfig := &ssh.ClientConfig{ User: user, Auth: auth, Timeout: 30 * time.Second, HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }, } addr := host + ":" + strconv.Itoa(port) sshClient, err := ssh.Dial("tcp", addr, clientConfig) /

Golang 库 - uuid

家住魔仙堡 提交于 2020-02-23 21:13:29
文章目录 前言 0 uuid 基础 格式 5种版本 如何使用5种版本 1 库的介绍 2 官方示例 测试结果 函数分析 生成 uuid 生成 uuid 的封装 解析 uuid 3 小结 END 前言 我正在学习酷酷的 Golang,可点此查看帖子 Golang学习笔记汇总 。 0 uuid 基础 UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。 格式 UUID使用16进制表示,共有36个字符(32个字母数字+4个连接符"-"),格式为8-4-4-4-12,如: 6d25a684-9558-11e9-aa94-efccd7a0659b xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx M中使用4位来表示UUID的版本,N中使用1-3位表示不同的variant。如上面所示:M =1, N = a表示此UUID为version-1,variant-1的UUID(Time-based ECE/RFC 4122 UUID)。 但是为什么最开始说它是一个128位的唯一标识呢?这里明明字母位数是(8+4+4+4+12)*8=256位。 因为上面的字母是用的16进制,一个16进制只代表4个bit,所以应该是(8+4+4+4+12)*4=128位。 5种版本 UUID现有5种版本,是根据不同的使用场景划分的,而不是根据精度

Golang并发编程之channel

青春壹個敷衍的年華 提交于 2020-02-23 02:14:47
channel 单纯将函数实现并发是没有任何意义的,函数与函数之间需要交换数据才能够体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的 goroutine 中容易发生竞态情况。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法肯定会造成性能影响。 Go语言的并发模型是 CSP ,提倡通过通信共享内存而不是通过共享内存而实现通信。 如果说 goroutine 是Go程序并发的执行体, channel 就是他们之间的连接。 channel 是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。 Go语言中的通道(channel)是一种特殊的类型,通道像一个传送带或者队列,总是遵循先入先出(FIFO)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明 channel 的时候需要为其制定元素类型。 channel类型 声明通道类型的格式如下: var 变量 chan 元素类型 举几个例子 var a1 chan int // 声明一个int类型的chan var a2 chan str // 声明一个str类型的chan var a3 chan []int // 声明一个int slice的chan 创建channel channel是一个引用类型

【Golang】LeetCode-剑指Offer-面试题53 - II-0~n-1中缺失的数字【四种解法】

蓝咒 提交于 2020-02-21 09:31:57
题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。 在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例 1: 输入: [0,1,3] 输出: 2 示例 2: 输入: [0,1,2,3,4,5,6,7,9] 输出: 8 限制: 1 <= 数组长度 <= 10000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof 解法一:二分查找 定义 left:=0 right:=len(nums) 用来确定数组的 mid 因为nums是有序数组,如果mid下标的值和mid不相同就在左边查找 如果 nums[mid]==mid ,说明左边是连续的有序数组,缺失的数字就在右边查找 left 需要向上取整+1 –执行用时:20 ms --消耗内存:6 MB func missingNumber ( nums [ ] int ) int { left := 0 right := len ( nums ) for left < right { mid := ( left + right ) >> 1 if nums [ mid ] != mid { //nums是有序数组,如果mid和数字不相同就在左边查找 right = mid