golang

golang解决中文乱码的方法

这一生的挚爱 提交于 2020-01-20 10:54:04
解决方法: 引入第三发转码包: git clone https://github.com/axgle/mahonia.git 示例: 1 package main 2 import ( 3 "bufio" 4 "fmt" 5 "io" 6 "mahonia" //编码转换 7 "os" 8 ) 9 10 func main() { 11 var enc mahonia.Decoder 12 enc = mahonia.NewDecoder("gbk") 13 //读取文件的案例 14 //读取文件的内容并显示在终端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString 15 file, err := os.Open("e:/test.txt") 16 if err != nil { 17 fmt.Println("open file err=", err) 18 } 19 20 //当函数退出时,要及时关闭file 21 defer file.Close() //防止内存泄露 22 //创建一个 *Reader , 是带缓冲的, 默认缓冲区为4096个字节 23 reader := bufio.NewReader(file) 24 //循环读取文件的内容 25 for { 26 str, err := reader

[Journey with golang] 5. Concurrent

情到浓时终转凉″ 提交于 2020-01-19 18:20:11
并发和并行是两种不同的概念。 并行意味着程序在任意时刻都是同时运行的 并发意味着程序在单位时间内是同时运行的 并行就是在任一粒度时间内都具备同时执行的能力,最简单的并行就是多机,多台机器并行处理。SMP表面上看是并行的,但由于是共享内存,以及线程间的同步等,不可能完全做到并行。 并发是在规定时间内多个请求都得到执行和处理,强调的是给外界的感觉,实际上内部可能是分时操作的。并发重在避免阻塞,使程序不会因为一个阻塞而停职处理。并发典型的应用场景:分时操作系统就是一种并发设计(忽略多核CPU)。 并行是硬件和操作系统开发者重点考虑的问题,作为应用层的程序员,唯一可以选择的就是充分借助操作系统提供的API和程序语言特性,结合实际需求设计出具有良好并发结构的程序,提升程序的并发处理能力。现代操作系统能够提供的最基础的并发模型就是多线程和多进程;编程语言这一层级可以进一步封装来提升程序的并发处理能力。 在当前的计算机体系下,并行具有瞬时性,并发具有过程性;并发在于结构,并行在于执行。应用程序具备好的并发结构,操作系统才能更好地利用硬件并行执行,同时避免阻塞等待,合理地进行调度,提升CPU利用率。应用层程序员提升程序并发处理能力的一个重要手段就是为程序设计良好的并发结构。 操作系统可以进行线程和进程的调度,本身具备并发处理能力,但进程切换代价还是过于高昂,进程切换需要保存现场,耗费较多的时间

重装go以后goland工程报错Error:cannot find package 错误的解决

旧城冷巷雨未停 提交于 2020-01-19 15:37:10
升级了一下golang的版本,卸载旧版本的go,下载及安装新版本的go,安装完以后打开goland编译工程报错,提示error:cannot find package xxxx,仔细看工程也没啥变化,原来原因是golang的安装程序会自动生成一个环境变量GOPATH,与我原来配置的不一样了,修改环境变量GOPATH问题即可解决。 来源: CSDN 作者: peihexian 链接: https://blog.csdn.net/peihexian/article/details/104036917

golang之不安全编程

无人久伴 提交于 2020-01-19 00:38:16
楔子 不安全编程?用golang以来也没发现有啥不安全的啊,而且golang有垃圾回收,也不需要我们来管理内存。当听到不安全编程这几个字,唯一能想到的也就是指针了,只有指针才可能导致不安全问题。我们知道golang中是有指针的,但是golang的指针并不能像C语言中的指针一样,可以进行运算,所以golang中的指针既提供了指针的便利性,又保证了安全。但是在golang中,可以通过一个叫做 unsafe 的包让指针突破限制,从而进行运算,一旦用不好会导致很严重的问题,但是用好了在某些场景下能够带来很大的便利,所以我们说这是不安全编程。但即便如此,我们还是可以使用的,而且golang的内部也在大量的使用unsafe这个包。 golang中的指针 尽管golang的指针没有C的指针那么强大,但是能够获取一个变量的地址,并且能通过地址来改变存储的值,我个人认为已经足够了。 package main import "fmt" func pass_by_value(num int){ num = 3 } func pass_by_pointer(num *int){ *num = 3 num = nil } func main() { num := 1 pass_by_value(num) fmt.Println("传递值:", num) //传递值: 1 pass_by_pointer(

【环境篇】golang环境变量二三事(三)

筅森魡賤 提交于 2020-01-18 10:31:57
GCCGO The gccgo command to run for 'go build -compiler=gccgo'. 表示"go build -compiler=gccgo",编译时指定的-compiler参数。 AR The command to use to manipulate library archives when building with the gccgo compiler. The default is 'ar'. 打包工具,默认"ar"。 CC The command to use to compile C code. 编译C语言的工具。 CGO_ENABLED Whether the cgo command is supported. Either 0 or 1. 是否使用cgo。 CGO_CFLAGS Flags that cgo will pass to the compiler when compiling C code. 指定编译C语言代码时的参数 CGO_CPPFLAGS 和 CGO_CXXFLAGS Like CGO_CFLAGS, CGO_CFLAGS_ALLOW, and CGO_CFLAGS_DISALLOW, but for the C preprocessor and C++ compiler. 这两个类似于CGO_CFLAGS

golang.是用类axios.js的api请求http接口,支持proxy

回眸只為那壹抹淺笑 提交于 2020-01-18 04:07:20
golang axios 项目地址:https://github.com/zhaojunlike/common-go 创建实例 func TestNewDefaultHttpRes(t *testing.T) { var opt = &Options{Proxy: &Proxy{Host: "127.0.0.1", Port: 8888}} client, _ := NewHttpClient(opt) defer client.Destroy() ids := []string{"d8469d31-ca22-474b-a329-450d32adc789", "d8469d31-ca22-474b-a329-450d32adc789", "d8469d31-ca22-474b-a329-450d32adc789"} var wg sync.WaitGroup for _, id := range ids { wg.Add(1) go func(id string) { uri := fmt.Sprintf("https://api.nike.com/launch/launch_views/v2/%s", id) fmt.Println("request:", uri) conf := NewConfig(uri) conf.Timeout = 3 * time.Second res

Golang对元素slice并去重

不想你离开。 提交于 2020-01-17 20:05:09
参考博客: https://blog.csdn.net/qq_27068845/article/details/77407358 封装的类似PHP的array_column // ArrayColumn 获取二维数组某一个键值 func ArrayColumn(input []map[string]interface{},columnKey string) ([]interface{}){ if len(input)==0 { return []interface{}{} } result := []interface{}{} // for i := 0; i < len(input); i++ { // result = append(result, input[i][columnKey]) // } for _,v := range input { fmt.Print(v[columnKey]) result = append(result, v[columnKey]) } return result } // ArrayUnique 数组去重 func ArrayUnique(input []string)([]string){ result := []string{} // 存放不重复主键 tempMap := map[string]byte{} for _, e :=

轻松掌握golang的defer机制

坚强是说给别人听的谎言 提交于 2020-01-17 19:37:20
什么是defer? 如果熟悉python的话,会感觉defer在某种程度上有点类似于python中的 上下文管理 ,golang中的defer是golang提供的一种延迟调用的机制,可以让一个函数在当前函数执行完毕 (即使出错) 后执行。 因此显然defer对于那些io流操作很有用,因为io流操作结束之后是需要close的,而程序员很容易忘记,所以defer是个好东西,经常用在资源清理、文件关闭、锁释放等等。 defer的用法 直接把一个函数调用放在defer后面即可。 f, err := os.Open(filepath) if err != nil { panic(err) } defer f.Close() //我们知道f.Close()是会返回一个error的,而defer后面只能是一个函数调用,不能是赋值语句 //不可以是defer _ = f.Close(),那怎么办呢?使用匿名函数即可 //defer func(){_ = f.Close()}() 再比如: package main import "fmt" func main() { defer fmt.Println(123) fmt.Println(456) /* 456 123 */ } 我们看到123是在456之后打印的,defer可以看做是把后面的函数压入了一个栈中,等到当前函数执行完毕

golang:Linux下安装go环境

风流意气都作罢 提交于 2020-01-17 17:31:44
自动安装 yum install golang -y 如果出现 先安装 yum install epel-release 手动安装 Golang官网下载地址:https://golang.org/dl/ (有墙) 打开官网下载地址选择对应的系统版本, 复制下载链接这里我选择的是go1.10.3.linux-amd64.tar.gz:https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz cd进入你用来存放安装包的目录。嫌麻烦就直接输入cd ~。然后执行 wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz 下载完成 执行tar解压到/usr/loacl目录下,得到go文件夹 tar -C /usr/local -zxvf go1.10.3.linux-amd64.tar.gz 添加/usr/loacl/go/bin目录到PATH变量中。添加到/etc/profile 或$HOME/.profile都可以 // 习惯用vim,没有的话可以用命令`sudo apt-get install vim`安装一个 vim /etc/profile // 在最后一行添加 export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin