从Ruby到Golang工程师

我转换了工作,开始接触Go语言,已经过去了3个月,所以我想在这里整理一下。
在之前的工作中,我接触了大约6年的Ruby。
从Ruby转而接触Go语言后,我希望能够整理出我学到的东西等等。

项目

    1. 在开始go之前

 

    1. 常数定义

 

    1. 继承

 

    1. 测试的写法

 

    总结

开始进行

书籍参考

开始学习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并记录下所学到的东西等等。

广告
将在 10 秒后关闭
bannerAds