Golang-Maps有序化遍历

2019-04-09

Go的map元素遍历顺序(使用range关键字)是随机的,而不是遵循元素的添加顺序,为解决这一问题,可使用下面的遍历方式。

package main

import (
	"fmt"
	"sort"
)

func main() {
	map1 := map[int]string{
    0:	"java",
    1:	"golang",
    2:	"python",
	}

	var keys []int
	for key := range map1 {
		keys = append(keys, name)
	}
	sort.Ints(keys)
	for _, key := range keys {
		fmt.Printf("%s\t%d\n", key, map1[key])
	}
}
阅读全文...

Golang-Modules包管理之道

2019-03-27

golang原始的包管理方式非常low,相当low,终于在go version 1.1.1之后,官方推出了模块概念,但是目前该功能还在试验阶段,有些地方还需要不断的进行完善。在官方正式宣布之前,打算不断修正这种支持。到时候就可以移除对GOPATHgo get命令的支持。

初始化

目前modules机制仍在早期阶段,golang提供了一个环境变量“GO111MODULE”,默认值为auto

auto 如果当前目录里有go.mod文件,就使用go modules,否则使用旧的GOPATH和vendor机制
on 如果你想直接使用modules而不需要从GOPATH过度,那么需要设置为on

modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为module,只要其中包含有go.mod文件。

我们就用一个空目录来创建我们的第一个module:

$ cd $GOPATH/src/github.com/wuwz
$ mkdir testmod
$ cd testmod
$ go mod init
go: creating new go.mod: module github.com/wuwz/testmod
阅读全文...

Golang-全平台交叉编译

2019-03-19

Golang的交叉编译要保证golang版本在1.5以上,我的环境是go1.11.5 darwin/amd64

交叉编译

# mac上编译linux和windows二进制
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

# linux上编译mac和windows二进制
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

# windows上编译mac和linux二进制
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go

参数解析

  • GOOS:目标操作系统
  • GOARCH:目标操作系统的架构
OS ARCH OS version
linux 386 / amd64 / arm >= Linux 2.6
darwin 386 / amd64 OS X (Snow Leopard + Lion)
freebsd 386 / amd64 >= FreeBSD 7
windows 386 / amd64 >= Windows 2000

编译其他平台的时候根据上面表格参数执行编译就可以了。

CGO

CGO_ENABLED=0的意思是使用C语言版本的GO编译器,参数配置为0的时候就关闭C语言版本的编译器了。自从golang1.5以后go就使用go语言编译器进行编译了。在golang1.9当中没有使用CGO_ENABLED参数发现依然可以正常编译。当然使用了也可以正常编译。比如把CGO_ENABLED参数设置成1,即在编译的过程当中使用CGO编译器,我发现依然是可以正常编译的。 实际上如果在go当中使用了C的库,比如import "C"默认使用go build的时候就会启动CGO编译器,当然我们可以使用CGO_ENABLED=0来控制go build是否使用CGO编译器。

阅读全文...

Golang-变量定义与初始化

2019-03-04

命名原则

go语言的变量名有字母数字和下划线组成,首字母不能为数字,但是字母不仅仅只限于英文字母,所有的UTF-8字符都是可以的。

使用var关键字

var num1 int = 1
var s1 string = "hello"
var num2 int // 如果没有赋初值,将使用所定义类型的默认值,此处num2=0

注意,Go语言是将变量类型放在后面的。

类型推断

var num1 = 100 // Go语言编译器可以根据你的初始值自动判断出类型
阅读全文...

Golang-遍历二叉树实现

2019-03-04

二叉树的几种遍历方式

1)先序遍历

1)访问根节点;2)采用先序递归遍历左子树;3)采用先序递归遍历右子树;

image.png (注:每个节点的分支都遵循上述的访问顺序,体现“递归调用”)

阅读全文...

IntelliJ IDEA Debugger 技巧

2019-02-22

Debug 设置

image.png

一般来说,保持默认即可,如果在Windows环境下,建议将图中标记的地方(Debug连接的方式)选择为 Shared memory,该选项是Windows下才有的特性,相比Socket的方式来说,要快不少。

常用快捷键

| 快捷键 | 介绍 | | :— | :— | | F7 | 在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方法,则不会进入该内嵌的方法中 必备 | | F8 | 在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则不进入当前方法体内 必备 | | F9 | 在 Debug 模式下,恢复程序运行,但是如果该断点下面代码还有断点则停在下一个断点上 必备 | | Alt + F8 | 在 Debug 的状态下,选中对象,弹出可输入计算表达式调试框,查看该输入内容的调试结果 必备 | | Ctrl + F8 | 在 Debug 模式下,设置光标当前行为断点,如果当前已经是断点则去掉断点 | | Shift + F7 | 在 Debug 模式下,智能步入。断点所在行上有多个方法调用,会弹出进入哪个方法 | | Shift + F8 | 在 Debug 模式下,跳出,表现出来的效果跟 F9 一样 | | Ctrl + Shift + F8 | 在 Debug 模式下,指定断点进入条件 | | Alt + Shift + F7 | 在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果方法体还有方法,则会进入该内嵌的方法中,依此循环进入 | | Drop Frame | 这个不是一个快捷键,而是一个 Debug 面板上的按钮。该按钮可以用来退回到当前停住的断点的上一层方法上,可以让过掉的断点重新来过 |

阅读全文...

使用qrsctl批量下载七牛云存储文件

2019-02-19

由于Markdown文档图床需要,之前选用了七牛作为云存储,但是前几天突然发现我所有的图片外链全部失效了, 原来是七牛将测试域名回收了,同时我自己的已备案域名也已经过期,导致我存储在七牛中的所有图片既不能预览,也不能下载,甚是恶心,在七牛的官网翻了一圈,总算是找到了把所有文件下载下来的解决方案。

image.png

安装命令行辅助工具(qrsctl)

下载地址:https://developer.qiniu.com/kodo/tools/1300/qrsctl

image.png

我这里使用的macOS,其他系统大同小异,参考着来吧。

cd ~/Downloads
wget http://devtools.qiniu.com/darwin/amd64/qrsctl

## 赋予qrsctl可执行权限
chmod +x qrsctl

## 执行测试
./qrsctl
阅读全文...