0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-12

プログラミング言語 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

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?