从Ruby到Golang工程师
我转换了工作,开始接触Go语言,已经过去了3个月,所以我想在这里整理一下。
在之前的工作中,我接触了大约6年的Ruby。
从Ruby转而接触Go语言后,我希望能够整理出我学到的东西等等。
项目
-
- 在开始go之前
-
- 常数定义
-
- 继承
-
- 测试的写法
- 总结
开始进行
书籍参考
开始学习Go语言时,首先阅读的书是以下几本:
《改订2版 みんなのGo言語》 作者:松木雅幸
《スターティングGo言語 (CodeZine BOOKS)》 作者:松尾愛賀
建立环境
我使用的是Goland,尽管是收费的。因为我只在Goland上使用过golang,所以无法进行比较,但通过安装插件等方式,工作变得非常舒适。
我正在参考这篇文章,在GoLand中设置Go语言的Linter,包括lint。
2. 常数定义(iota)
鑑於在工作上經常使用,我希望可以對其進行定義並進行記載。
同時,由於IOTA的使用也帶來了便利,我也希望對其進行記載。
当我们试图在Ruby中以普通的方式定义常量时,可能会得到以下类似的感觉。
class Jiro
module Topping
YASAI = 0
NINNIKU = 1
ABURA = 2
end
end
直接用golang写成如下。
package jiro
const (
ToppingYASAI = 0
ToppingNINNIKU = 1
ToppingABURA = 2
)
然而,在这种递增的情况下,有一种更简洁的方法,它被称为”iota”标识符。
package jiro
const (
ToppingYASAI = iota // 0
ToppingNINNIKU // 1
ToppingABURA // 2
)
如果想为各个常量添加(uint)类型,请?
package jiro
type JiroTopping uint
const (
ToppingYASAI JiroTopping = iota // uint 0
ToppingNINNIKU // uint 1
ToppingABURA // uint 2
)
既然正在使用golang,如果有需要对常量进行递增的处理,使用iota似乎是个不错的选择。
3. 传承
我在业务中需要一些共用的方法,所以我搜索了一下,发现Golang中没有继承的概念,但可以通过嵌套结构体来模拟实现。
class Jiro
def rand_jumon
%w("野菜マシマシ" "野菜ニンニクからめ" "油マシマシ").sample
end
end
class Pjiro < Jiro
attr :store_name
def initialize
@store_name = "Pjiro"
end
end
class Sjiro < Jiro
attr :store_name
def initialize
@store_name = "Sjiro"
end
end
irb(main):034:0> p = Pjiro.new
=> #<Pjiro:0x00007ff6bc8b53e8 @title="Pjiro">
irb(main):035:0> p.rand_jumon
=> "野菜ニンニクからめ"
irb(main):037:0> s = Sjiro.new
=> #<Pjiro:0x00007ff6ce90f200 @title="Sjiro">
irb(main):038:0> p.rand_jumon
=> "油マシマシ"
import(
"fmt"
)
type Jiro struct {}
func (j *Jiro) RandJumon() string {
return "aaa"
randInt = rand.Intn(2)
switch randInt {
case 0:
return "野菜マシマシ"
case 1:
return "野菜ニンニクからめ"
case 2:
return "油マシマシ"
}
}
type Pjiro struct {
// Jiroをネスト
Jiro
storeName string
}
type Sjiro struct {
// Jiroをネスト
Jiro
storeName string
}
func main() {
pjiro := &Pjiro{
storeName: "pjiro",
}
fmt.Printf("%#v", pjiro.RandJumon())
}
4. 如何撰写测试报告
使用Golang编写的测试通常采用类似于Ruby中的rspec-parameterized的方式,即使用表驱动测试来编写。(将每个测试项目放入表格中,并使用迭代的方式进行测试)
# main.rb
def generate_jumon(jumon_a, jumon_b)
jumon_a+jumon_b
end
# main_spec.rb
describe "squre" do
where(:jumon_a, :jumon_b, :generate_jumon) do
[
["野菜マシ", "にんにく", "野菜マシにんにく"],
["にんにく", "カラメ", "にんにくカラメ"],
]
end
with_them do
it "#{jumon_a} + #{jumon_b} = #{generate_jumon}" do
expect(generate_jumon(jumon_a, jumon_b)).to eq generate_jumon
end
end
end
// main.go
package main
func generateJumon(jumonA string, jumonB string) string {
return jumonA + jumonB
}
// main_test.go
package main
import(
"testing"
)
func TestGenerateJumon(t *testing.T){
tests := []struct{
jumonA string,
jumonB string,
want string
}{
{"野菜マシ", "にんにく", "野菜マシにんにく"},
{"にんにく", "カラメ", "にんにくカラメ"},
}
for _, t := range tests {
if got := generateJumon(t.jumonA, t.jumonB); got != t.want {
t.Fatalf("want = %s, got = %s", t.want, got)
}
}
}
除了ruby之外,rspec与golang在以下方面不同:rspec将测试代码放在spec/*/*/xx_spec.rb下,而golang将测试代码放在与被测试文件相同的层级下。
src/domain/jiro.go // テスト対象ファイル
jiro_test.go // テストコード
5. 综上所述
因为我个人非常喜欢二郎,所以抱歉样本代码里都是二郎的梗哈哈。
今后我会继续尝试使用golang并记录下所学到的东西等等。