开始学习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特制的扩展。

go-vscode.png

安装相关的???

※ 这个区域需要稍后核实内容,可以使用类似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が発生する理由を理解する。
广告
将在 10 秒后关闭
bannerAds