Go
Linux

『ふつうのLinuxプログラミング』サンプルプログラムをGoで書いてみる① #golang

More than 1 year has passed since last update.

はじめに

ふつうのLinuxプログラミング(第二版)が12年振りにリニューアル発売されるという話を聞いて、さっそく予約購入しました。

わたしは全くのプログラミング初心者のときにGoに出会い、基礎の基礎から学び初めて1年ほどになる新米プログラマ/社内SEです。

Goを学ぶ中で、勉強会等に参加してもOSやカーネル周りの知識がないために理解が進まないことが多く悩んでいました。
そこで、この本を読んで基礎から勉強しようと思いました。

本の中では全てのプログラムがC言語で書かれていますが、せっかくなのでGoで書き直してみようと思い、この記事を書きました。

誤りや良くない書き方がありましたら、コメント等でご指摘いただければ幸いです :bow:

コマンドライン引数を表示するプログラム

args.c
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    int i;

    printf("argc=%d\n", argc);
    for (i = 0; i < argc; i++) {
        printf("argv[%d]=%s\n", i, argv[i]);
    }
    exit(0);
}

出典: ふつうのLinuxプログラミング(第二版) P18

Goで書いてみる

args.go
package main

import (
    "fmt"
    "os"
)

func run() error {
    argc := len(os.Args)
    if argc < 2 {
        return fmt.Errorf("引数が足りません。")
    }
    fmt.Println("argc=", argc)

    for i := 0; i < argc; i++ {
        argv := os.Args
        fmt.Printf("argv[%d]=%s\n", i, argv[i])
    }

    return nil
}

func main() {
    if err := run(); err != nil {
        fmt.Fprintf(os.Stderr, "%s\n", err.Error())
        os.Exit(1)
    }
}

エラー処理、関数の切り分けについては、
Women Who Goでハンズオンの教材としている@tenntennさんのgithub.com/tenntenn/gohandonを参考にさせていただきました。

Goではfmtパッケージによってフォーマットが容易に選べる点が便利だと感じました。
またGoのmain関数は引数と戻り値を持たないため、C言語で書かれたサンプルプログラムとは異なる構成になりました。

参考

github.com/tenntenn/gohandon
Goでコマンドラインツールを作ろう #1