Goで香水を実装してみる


はじめに

この記事は,学校の帰りに思いついたものを勢いだけで実装したクソコードを載せているだけのネタ記事です.
間違ってもこれを見てGoの勉強をしようなどと思わないでください.

若干 「Javaで湯婆婆を実装してみる」にインスパイアされている部分があります.

実装する

コード

main.go
package main

import (
    "fmt"
)

type human struct {
    Dolce   bool
    Gabbana bool
    Kousui  perfume
}

type perfume struct {
}

func (p *perfume) say() {
    fmt.Println(`僕がフラれるんだ`)
}

func main() {

    Kimi := human{true, true, perfume{}}

    if Kimi.Dolce && Kimi.Gabbana {
        Kimi.Kousui.say()
    }
}

これが実際のコードです.fmtパッケージしか使っていないので,基本的な環境構築ができていればこのままコピペで動くはずです.
今回実装したのは,曲の中で最も有名であろう,「君のドルチェ&ガッバーナの その香水のせいだよ」の部分になります.実装するにあたって,歌詞を調べてみると他にも実装したら面白そうな部分があったので,暇なときにでも完全版を作りたいです(適当)

解説

構造体

type human struct {
    Dolce   bool
    Gabbana bool
    Kousui  perfume
}

type perfume struct {
}

今回,使用した構造体は

  • human
  • perfume

の2つです.
humanは歌詞中の「君」を表現するために使用しました.
perfumeは名前の通り「香水」の部分です.この機能なら構造体にする必要もなかったのですが,次項で解説するメソッドを使用したかったため構造体にしています.

条件式

    if Kimi.Dolce && Kimi.Gabbana {
        Kimi.Kousui.say()
    }

ここが一番実装したかった部分です.

perfumeを構造体にして,sayメソッドを追加しているので,「KimiのDolce && Gabbanaの そのKousuiのsayだよ」というように実装できます.

おまけ

このコードでは,Dolce と Gabbanaの値が一定のため,何度実行しても同じことの繰り返しでまたフラれてしまいます.
そこで,

package main

import (
    "fmt"
    "math/rand"
)

type human struct {
    Dolce   bool
    Gabbana bool
    Kousui  perfume
}

type perfume struct {
}

func (p *perfume) say() {
    fmt.Println(`僕がフラれるんだ`)
}

func main() {

    Kimi := human{true, true, perfume{}}

    if rand.Intn(2) == 0 {
        Kimi.Dolce = false
    }

    if rand.Intn(2) == 0 {
        Kimi.Gabbana = false
    }

    if Kimi.Dolce && Kimi.Gabbana {
        Kimi.Kousui.say()
    }
}

というようにrand.Intn(2)を追加して25%の確率で香水のせいにするように変更してみました.

あとがき

こんな雑な記事をここまで読んでいただき,ありがとうございました.
今回はGoで香水(Go水)を実装しましたが,Pythonで書けばif Dolce and Gabbanaって書けるなーなどと思ったので,他の言語でも実装してみると面白いかもしれません.