Help us understand the problem. What is going on with this article?

プログラミング言語Goを読みながらメモ(第三章)

More than 1 year has passed since last update.

プログラミング言語 Go を読みながらメモ。

第一章 : https://qiita.com/Nabetani/items/077c6b4d3d1ce0a2c3fd
第二章 : https://qiita.com/Nabetani/items/d053304698dfa3601116

で。

整数 - 演算子

&^ という演算子があることに驚いた。というか、要らない気がする。
a &(^ b)a &^ b は同じでしょ? → 当記事のコメント欄参照のこと

なぜ bit not を ^ にしたんだろう。由来が気になる。
指数演算子がないのがちょっと残念。

整数 - Cとの違い

C 言語と異なり、整数の int への自動昇格がないので、

go
package main

import "fmt"

func main() {
    b := byte(255)
    fmt.Printf("%d\n", (b << 1)) //=> 254
}

となる。

C言語では

C11
#include <stdio.h>
#include <stdint.h>

int main()
{
    uint8_t b = 255;
    printf( "%d\n", b<<1); //=>510
    return 0;
}

となる。要注意と思う。

あと。剰余の扱いが、私の好きじゃない方になっていた。

go
package main

import "fmt"

func main() {
    fmt.Printf("%d\n", -5%3) //=> -2
}

ということ。まあ昔の C言語みたいに処理系依存?であるよりはずっといいけど。

実装依存の変換

1e100 のような巨大な数を整数に変換した結果が実装依存なのは残念。手元の処理系では

go
package main

import "fmt"

func main() {
    f := 1e100
    fmt.Printf("%x\n", int(f))   //=>-8000000000000000
    fmt.Printf("%x\n", int32(f)) //=>-80000000
    fmt.Printf("%x\n", int16(f)) //=>0
    fmt.Printf("%x\n", int8(f))  //=>0
}

となった。ちょっと気持ち悪い。

ちなみに、int(1e100) とじかに書くとコンパイルエラーになった。好ましい。

ちなみに同じ様にたぶん処理系依存の C 言語では

c11
#include <stdio.h>
#include <stdint.h>

int main(){
  printf( "%llx\n", (int64_t)1e100); //=> 7ffee017b910
  printf( "%x\n", (int32_t)1e100); // => 100
  printf( "%x\n", (int16_t)1e100); //=> 0
  printf( "%x\n", (int8_t)1e100); //=>0
}

と、さらに気持ち悪い結果になった。

複素数型

言語組み込みで 1.2+3.4i のように複素数が書けるのは好ましい。ここは ruby と似ているけど、要素型が浮動小数点に決まるところは似ていない。ruby は整数型を要素にも出来るからね。

imagreal が、関数であってメソッドではないのはちょっと違和感があるけど、まあそういう文化なのだろう。

真偽値

言語 真偽
C言語 0と _False が偽で、それ以外の整数は真
GoとJava true のみが真で、false のみが偽
Ruby false と nil が偽で、それ以外は真
JavaScript と PHP むずかしい
C++ ややむずかしい

ということで、Go は Java と同じ道を選んだようだ。
後知恵で Google 様が作っているんだから当たり前だけど、JavaScript や PHP の選んだ道を進まなくて良かった。

Ruby の選んだ道が一番好きなんだけど、Go の立場なら Java と同じだろうなぁとも思う。

文字列

文字列が変更不可能なのは、好ましい感じがする。UTF-8 にべったりという立場も悪くない。

strconv.FormatIntstrconv.ParseInt があるので、どう書くで n進数の問題が出ても安心。

Ruby のような多彩な文字列定数表記がないのは残念。バッククオート表記しかないのか。

iota

ギリシャ文字の ι / Ι (見てくれではなんだかわからないが...) なんだろうけど、なぜ iota なのか、由来情報も書いてほしかった。

型なし定数の精度

Pascal の定数も型がないんじゃなかったっけ。うろ覚え。
あと、精度がどうなっているのか実験したい。

内部的に 128bit 整数があるのなら、言語にも出してくれればいいのに。

次は第四章 : https://qiita.com/Nabetani/items/59bfd00dc3323883a07f

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした