开始学习Go语言
昨天,在yahoo!大阪先生的MixLeap平台上,我体验了Go语言的动手实践,为了复习知识,我决定从环境搭建开始尝试一下。
※动手实践是在MacOS环境下进行的,但本文是在Windows10上进行环境搭建的。
安装Golang环境
chocolatey的安装
按下Windows键+R,在运行框中输入cmd,然后以管理员权限启动命令提示符。
Microsoft Windows [Version 10.0.17763.557]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
Getting latest version of the Chocolatey package for download.
(省略)
You may need to shut down and restart powershell and/or consoles
first prior to using choco.
Ensuring chocolatey commands are on the path
Ensuring chocolatey.nupkg is in the lib folder
Go语言的安装
C:\WINDOWS\system32>choco install golang
Chocolatey v0.10.15
Installing the following packages:
golang
By installing you accept licenses for the packages.
Progress: Downloading golang 1.12.5... 100%
(省略)
确认安装
C:\WINDOWS\system32>go version
go version go1.12.5 windows/amd64
C:\WINDOWS\system32>echo %GOPATH%
C:\Users\nandymak\go
C:\WINDOWS\system32>echo %GOROOT%
C:\Go\
安装Go的包管理工具
C:\Users\nandymak>go get -u github.com/golang/dep/cmd/dep
C:\Users\nandymak>dep version
dep:
version : devel
build date :
git hash :
go version : go1.12.5
go compiler : gc
platform : windows/amd64
features : ImportDuringSolve=false
安装VS Code环境
安装由Microsoft特制的扩展。

安装相关的???
※ 这个区域需要稍后核实内容,可以使用类似Qiita的剪贴板(Todo)
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/zmb3/gogetdoc
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/cweill/gotests/...
特别是最后的”gotests/…”我无法理解。
我尝试写一下源代码。
这次我们以《日经xTECH》的Python代码易于编写为例进行了样例展示。
Python示例代码
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(5))
>120
Go语言版本
package factorial
// Factor は与えられたnの値を1ずつ減らしながら掛けていきます
func Factor(n int) int {
if n == 1 {
return 1
}
return n * Factor(n-1)
}
package factorial
import "testing"
// Factor は与えられたnの値を1ずつ減らしながら掛けていきます
func TestFactor(t *testing.T) {
got := Factor(5)
if got != 120 {
t.Errorf("Error")
}
}
nandymak@windows10:~/c/Users/nandymak/go/src/factorial$ go test -v
=== RUN TestFactor
--- PASS: TestFactor (0.00s)
PASS
ok _/home/i087128/c/Users/nandymak/go/src/factorial 0.042s
有一点陷入了困境
根据Python代码,我使用了if-else进行编写,但是出现了错误(警告?),所以我按照上述方式进行了修改。
package factorial
// Factor は与えられたnの値を1ずつ減らしながら掛けていきます
func Factor(n int) int {
if n == 1 {
return 1
}
return n * Factor(n-1)
}
syntax error: unexpected else, expecting }
syntax error: unexpected return at end of statement
syntax error: non-declaration statement outside function body
确实非常深奥。
我已经确认通过在Python中以同样的方式重新编写,它仍然可以正常运行。
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(5))
>120
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(5))
>120
自动生成测试代码骨架
我还尝试了一下测试代码的自动生成。
在被测试的源代码上右击函数名,选择“Go:生成函数的单元测试”。
生成了以下代码。
package factorial
import "testing"
// Factor は与えられたnの値を1ずつ減らしながら掛けていきます
func TestFactor(t *testing.T) {
type args struct {
n int
}
tests := []struct {
name string
args int
want int
}{
// TODO: Add test cases.
{"5の時120を返す", 5, 120},
{"6の時185を返す", 6, 185},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Factor(tt.args); got != tt.want {
t.Errorf("Factor() = %v, want %v", got, tt.want)
}
})
}
}
在”// TODO: Add test cases.”之后添加测试数据。
不知为何,最后一行也需要逗号。
执行后结果如下。
Running tool: C:\Go\bin\go.exe test -timeout 30s factorial -run ^(TestFactor)$
--- FAIL: TestFactor (0.00s)
--- FAIL: TestFactor/6の時185を返す (0.00s)
c:\Users\999000_087128\go\src\factorial\factorial_test.go:23: Factor() = 720, want 185
FAIL
FAIL factorial 2.195s
Error: Tests failed.
在「6」的情况下,720发生变化,从而触发了错误检测。
待办事项
-
- WSLとVS Codeで動くようにする
-
- VS CodeのExtension関連と思われるGoのモジュールについて用途などを理解する。
-
- “go get -u -v github.com/cweill/gotests/…” の用法を理解する。
- if-elseでSyntaxErrorが発生する理由を理解する。