分类 Go 下的文章

“Go是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 罗伯特·格瑞史莫、罗勃·派克及肯·汤普逊于2007年9月开始设计Go,稍后伊恩·兰斯·泰勒、拉斯·考克斯加入项目。Go是基于Inferno操作系统所开发的。”

0、官方安装命令在这儿

https://golang.org/doc/install

1、下载安装包,当前(20210526)最新版本为https://golang.org/dl/go1.16.4.linux-amd64.tar.gz

本站缓存:https://const.net.cn/down/go1.16.4.linux-amd64.tar.gz

2、下载完成后,用root权限执行下面命令

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.4.linux-amd64.tar.gz

3、将/usr/local/go/bin 目录添加到环境变量($HOME/.profile 或者 /etc/profile)

export PATH=$PATH:/usr/local/go/bin

4、验证安装是否正确

source /etc/profile
go version

输出类似:
go version go1.16.4 linux/amd64

5、Hello Go

cd
mkdir hello
cd hello
go mod init const.net.cn/hello

输出:

go: creating new go.mod: module const.net.cn/hello

将下面内容保存到hello.go文件中

package main

import "fmt"

func main() {
    fmt.Println("Hello, Go!")
}

运行程序:

go run .

输出:

Hello, Go!

PS:
go mod init packagename可以创建一个空的go.mod
go mod tidy也可以用来为go.mod增加丢失的依赖,删除不需要的依赖

0、下载 Windows 安装包
官方地址在这儿:https://golang.google.cn/
下载包地址:https://golang.google.cn/dl/go1.16.4.windows-amd64.msi

1、安装 go1.16.4.windows-amd64.msi
点击 "Next" 就行2021-05-29_171051.png
图1、安装Go语言开发程序过程图

2、验证运行go version
在命令行(cmd)中,运行 go version 出现

go version go1.64.4 windows/amd64

就表示安装成功了。

3、编写运行 Hello World
在命令行下面执行相应操作就好

mkdir hellowin10
cd hellowin10
go mod init const.net.cn/hellowin10
notepad hello.go

hello.go内容如下:

package main
import (
"fmt"
)
func main(){
 fmt.Println("Hello Win10")
}

运行

go run .

结果

Hello Win10

1、使用 os/exec 中的exec.Command方法来实现

package main
import (
"fmt"
"os/exec"
)
func main(){
 cmd := exec.Command("ipconfig", "/all")
 output, err := cmd.CombinedOutput()
 if err != nil {
 fmt.Println(fmt.Sprint(err) + ":" + string(output))
 }
 fmt.Println(string(output))
}

运行
go run .
结果... 乱码
2021-05-29_173706.png

2、解决 Go exec.Command 乱码
这个问题主要应该还是在Windows下出现,Linux下工具没有提示中文信息,所以没有遇到这个问题
如果命令执行结果输出的是英文提示信息,在 命令行提示下 输入

chcp 65001

应该就可以正常了。
2021-05-29_174313.png

3、解决 Go exec.Command 中文乱码
中文乱码的问题没什么好方案了,只能老老实实转码了。
需要引入一个新的mod

go get -v  golang.org/x/text/encoding/simplifiedchinese 

提示这个才叫正确
go: downloading golang.org/x/text v0.3.6
go: found golang.org/x/text/encoding/simplifiedchinese in golang.org/x/text v0.3.6
golang.org/x/text/encoding/internal/identifier
golang.org/x/text/transform
golang.org/x/text/encoding
golang.org/x/text/encoding/internal
golang.org/x/text/encoding/simplifiedchinese

如果提示类似错误信息

go get golang.org/x/text/encoding/simplifiedchinese: module golang.org/x/text/encoding/simplifiedchinese: Get "https://proxy.golang.org/golang.org/x/text/encoding/simplifiedchinese/@v/list": dial tcp 172.217.160.81:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
就加个http_proxy吧

set http_proxy=http://localhost:1080

完整的代码

package main
import (
 "fmt"
 "os/exec"
 "golang.org/x/text/encoding/simplifiedchinese"
)

type Charset string

const (
    UTF8    = Charset("UTF-8")
    GB18030 = Charset("GB18030")
)

func main(){
 cmd := exec.Command("ipconfig", "/all")
 output, err := cmd.CombinedOutput()
 if err != nil {
 fmt.Println(fmt.Sprint(err) + ":" + string(output))
 }
 cmdRe:=ConvertByte2String([]byte(string(output)),"GB18030")
 fmt.Println(cmdRe)    
}

func ConvertByte2String(byte []byte, charset Charset) string {
    var str string
    switch charset {
    case GB18030:
        var decodeBytes,_=simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
        str= string(decodeBytes)
    case UTF8:
        fallthrough
    default:
        str = string(byte)
    }
    return str
}

运行结果:
2021-05-29_180125.png

1、string 转为[]byte

var str string = "const.net.cn"
var data []byte = []byte(str)

2、byte转为string

var data [5]byte 
byte[0] = 'c'
byte[1] = 'o'
byte[2] = 'n'
byte[3] = 's'
byte[4] = 't'
var str string = string(data[:])

1. Go run shell script or Go run shell string

curl := "curl -v https://const.net.cn"
cmd := exec.Command("bash", "-c", curl)
stdout, err := cmd.CombinedOutput()
if err != nil {
    fmt.Println("curl " + err.Error())
    return
}
fmt.Println(string(stdout)) 

2.输出结果

  • Uses proxy env variable https_proxy == 'socks5://127.0.0.1:1080'
  • Trying 127.0.0.1:1080...
  • TCP_NODELAY set % Total % Received % Xferd Average Speed Time Time Time Current

                                 Dload  Upload   Total   Spent    Left  Speed   0     0    0     0    0     0      0      0 --:--:-- --:--:--

    --:--:-- 0

  • SOCKS5 communication to const.net.cn:443
  • SOCKS5 connect to IPv4 43.129.233.128:443 (locally resolved)
  • SOCKS5 request granted.
  • Connected to 127.0.0.1 (127.0.0.1) port 1080 (#0)
  • ALPN, offering h2
  • ALPN, offering http/1.1
  • successfully set certificate verify locations:
  • CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs } [5 bytes data]
  • TLSv1.3 (OUT), TLS handshake, Client hello (1): } [512 bytes data]
  • TLSv1.3 (IN), TLS handshake, Server hello (2): { [122 bytes data]
  • TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): { [25 bytes data]
  • TLSv1.3 (IN), TLS handshake, Certificate (11): { [2780 bytes data]
  • TLSv1.3 (IN), TLS handshake, CERT verify (15): { [264 bytes data]
  • TLSv1.3 (IN), TLS handshake, Finished (20): { [52 bytes data]
  • TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): } [1 bytes data]
  • TLSv1.3 (OUT), TLS handshake, Finished (20): } [52 bytes data]
  • SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
  • ALPN, server accepted to use http/1.1
  • Server certificate:
  • subject: CN=const.net.cn
  • start date: May 19 00:00:00 2021 GMT
  • expire date: May 18 23:59:59 2022 GMT
  • subjectAltName: host "const.net.cn" matched cert's "const.net.cn"
  • issuer: C=CN; O=TrustAsia Technologies, Inc.; OU=Domain Validated SSL; CN=TrustAsia TLS RSA CA
  • SSL certificate verify ok. } [5 bytes data]

GET / HTTP/1.1
Host: const.net.cn
User-Agent: curl/7.68.0
Accept: /

......