Go (プログラミング言語)

プログラミング言語

Go1Google2009[4][5]GoCCSP[6]Go[7]
Go
Go
Goのロゴ
パラダイム 構造化プログラミング手続き型プログラミング命令型プログラミング並行計算オブジェクト指向プログラミング関数型プログラミング ウィキデータを編集
登場時期 2009年11月10日 (14年前) (2009-11-10)
設計者 Robert Griesemer、ロブ・パイクケン・トンプソン
開発者 Google
最新リリース 1.22.4[1] ウィキデータを編集/ 2024年6月4日 (33日前)
型付け 強い静的型推論構造的英語版[2][3]
主な処理系 gc、gccgo
影響を受けた言語 C言語、Oberon-2、Limbo、Active Oberon、Communicating Sequential ProcessesPascalOberon-2Smalltalk、Newsqueak、Modula-2、Alef、APLBCPL、Modula、Occam ウィキデータを編集
影響を与えた言語 Crystal
プラットフォーム DragonFly BSDFreeBSDLinuxmacOSNetBSDOpenBSDPlan 9 from Bell LabsSolarisMicrosoft WindowsiOSAndroidAIXillumos ウィキデータを編集
ライセンス BSDライセンス ウィキデータを編集
ウェブサイト
拡張子 go ウィキデータを編集
テンプレートを表示

PythonGoGopher

LinuxMac OS X[8]201231.0Windows[9]2014121.4Android[10]20158191.5iOS[11]2011510 Google App Engine 1.5.0Go[12]201881.11WebAssembly[13]

名称

編集

GolangGoGo[14]golanggolang.orggo.org[14]

GOGo[14]

歴史

編集
 
現在のマスコットGopher。以前はGoのロゴとして使用されていた。

20091110Go[15]1.02012328[16]GoGoogle使使[17]

2

GoogleGoLinuxBSDmacOSPlan 9Windows2015[18]Go1.5[19]

2gccgoGCC[20]

GoGoogleRobert GriesemerGoogleIT[21]

JavaC++

RubyPython[22]

IDE



3C++[23]

1.664MIPSLinux32x86Android[24][25]

20177132[26]1.x21.202

20184Gopher3

20218161.1764ARMWindows[27]2Nightly BuildRust

コード例

編集

Hello world

編集

次のコードはGoで書いたHello worldプログラムである。

package main

import "fmt"

func main() {
    fmt.Println("Hello, World")
}

並行性の例

編集

次のサンプルプログラムは、Goの並行性機能をデモンストレーションする非同期プログラムの実装である。2つの"goルーチン"(軽量スレッド)を立ち上げている。一方はユーザーがテキストを入力するのを待機し、他方はタイムアウトを実現する。select文が2つのgoルーチンがメインルーチンにメッセージを送信するのを待機し、最初に到達したメッセージに対して動作を実行する(コード例はDavid Chisnallの本のコードを一部修正している)[28]:152

package main

import (
    "fmt"
    "time"
)

func readword(ch chan string) {
    fmt.Println("Type a word, then hit Enter.")
    var word string
    fmt.Scanf("%s", &word)
    ch <- word
}

func timeout(t chan bool) {
    time.Sleep(5 * time.Second)
    t <- true
}

func main() {
    t := make(chan bool)
    go timeout(t)

    ch := make(chan string)
    go readword(ch)

    select {
    case word := <-ch:
        fmt.Println("Received", word)
    case <-t:
        fmt.Println("Timeout.")
    }
}

言語機能の特徴

編集

文法

編集

LimboPascalAda使CforifiotaASPCSP[29]

構造体

編集

Goにはユーザー定義の複合型を記述することのできる構造体の機能があり、下記のように記述する。

package main

import "fmt"

// 新しい構造体型の定義。各フィールドの識別子とその型名を指定。
type Person struct {
    name string // 名前。
    age int // 年齢。
}

// メソッドの定義。
func (m *Person) PrintName() {
    fmt.Printf("Name = %s\n", m.name)
    //fmt.Printf("Name (%T) = %#v\n", m.name, m.name)
}

func (m *Person) PrintAge() {
    fmt.Printf("Age = %d\n", m.age)
    //fmt.Printf("Age (%T) = %#v\n", m.age, m.age)
}

func main() {
    var person Person
    person.name = "John Smith"
    person.age = 24
    // 以下のように書くこともできる。
    //person := Person{ "John Smith", 24 }
    person.PrintName()
    person.PrintAge()
    // 以下のように書式指定すると、型名とリテラル表現を出力できる。
    fmt.Printf("person (%T) = %#v\n", person, person)
}

nameagePersonPrintName()PrintAge()GoJava

Go(m *Person) ( ) 2



GoJavaC#

新しい型の定義

編集

Goではtype構文を利用して既存の型から新しい型を定義できる。

次の例では、int型を元に MathInt という新しい型を定義している。

type MathInt int

C/C++typedefC#usingint

int () 


package main

import (
    "fmt"
    "math"
)

type MathInt int

func (x MathInt) Abs() float64 {
    return math.Abs(float64(x))
}

func main() {
	var x MathInt = -10
	fmt.Printf("%d\n", x) // -> -10
	fmt.Printf("%f\n", x.Abs()) // -> 10.000000
	fmt.Printf("%T\n", x) // -> main.MathInt
}

Go 1.9ではtypeキーワードを利用した型エイリアス (type alias) 構文が別途追加された[30]。こちらはC/C++のtypedefやC#のusingエイリアスディレクティブと類似の機能である。

package main

import (
    "fmt"
    "math"
)

type MyInt = int

func main() {
    var x MyInt = -10
	fmt.Printf("%d\n", x) // -> -10
    fmt.Printf("%f\n", math.Abs(float64(x))) // -> 10.000000
	fmt.Printf("%T\n", x) // -> int
}

匿名フィールド

編集

Goには継承が意図的に実装されていない。しかし匿名フィールドという機能を用いることで、ある構造体と同じフィールド、メソッドを持つ構造体を容易に作成することができる。

type Base int

func (_ *Base) Function() {
}

type Derived struct {
  Base
}

// 呼び出し例
var derived Derived
derived.Function()

このようにして作られた構造体から匿名フィールドで用いられた元となる構造体の型に暗黙的にキャストするような機能は存在していない。

interface

編集

GoC++Gointerface使

interfaceC#interfaceGointerfaceinterface

Gointerface
type Container interface {
	Begin() Iterator
	End() Iterator
}

Goのinterfaceは、MLのsignatureや、かつてg++に存在したsignatureというC++拡張と全く同じ機能である。


Godefer

deferdefer[1]

使

defer
defer 関数呼び出しまたはメソッド呼び出し

deferdefer使defer

defer[2]
defer func() {
	message := "done"
	fmt.Println(message)
}()

例外処理

編集

使Gotry-catch0使GoBool

ダウンキャスト

編集

Goはインターフェース型の値から、基底型の値(インターフェース型に変換される前の型の値)を動的に安全に得るダウンキャストの仕組みとして「型アサーション」と呼ばれる機能を備えている。

// Value の返値はどんな型でも構わない
var i interface{} = Value()

/*
    i の基底型を string と仮定し、
    実際にそうであれば s には変換結果が、 ok には true がセットされ、
    そうでなければ s にはstring型の初期値(ゼロ値)が、 ok には false がセットされる。

    以下の様に2つ目の返値を無視すると、i の基底型が string でなければ暗黙的にランタイムパニックとなる
    s := i.(string)
*/
if s, ok := i.(string); ok {
    fmt.Println ("文字列: ", s)

} else {
    var kind string

    // 型switch
    switch i.(type) {
    case int:
        kind = "数値"
    default:
        kind = "その他"
    }

    fmt.Printf ("%s: %v\n", kind, i)
}

標準パッケージのreflectを使うことで[31]、対象の値型やその値などの詳細を得ることができる。

名前とモジュールの管理

編集

Goには名前とモジュールを管理するために、パッケージという仕組みを持っている。

基本的なパッケージの使用例を下記に示す。

package main			// 現在のソースファイルが所属するパッケージ名の指定
				// 本記事の例では省略されている事が多いが本来は必須である
 
import _ "./sub/a"		// (1)ソースファイル中から名前が使用されないパッケージの取り込み
import . "./sub/b"		// (2)パッケージ名を省略して、パッケージ内の名前を現在のソースファイルに全て取り込む
import alias_c "./sub/c"	// (3)パッケージ名に別名を付けてパッケージ名を現在のソースファイルに取り込む
import "./sub/d"		// (4)パッケージ名に末端のパッケージ名と同じ名前を付けて現在のソースファイルに取り込む

func main() {
	Function()		// (2)のパッケージに所属するFunctionの呼び出し
	alias_c.Function()	// (3)のパッケージに所属するFunctionの呼び出し
	d.Function()		// (4)のパッケージに所属するFunctionの呼び出し
}

GoimportGoGo

Go[3]

GoGoinitmainimport使

アクセス指定子

編集

Go 

提供しない機能

編集

[29]FAQ

処理系

編集

Go2[32]

gcGoGo1.4C1.5CGoGoyaccbison使

GccgoC++GCCGo

脚注

編集

注釈

編集
  1. ^ それがパニックによる中断であったとしても。
  2. ^ 組み込み関数を呼び出すこともできない。
  3. ^ 完全修飾名

出典

編集


(一)^ Release History. Template:Cite web accessdate 

(二)^ Why doesn't Go have "implements" declarations?. go.dev. 2015101

(三)^ Pike, Rob (20141222). Rob Pike on Twitter. 2016313 Go has structural typing, not duck typing. Full interface satisfaction is checked and required.

(四)^ Kincaid, Jason (20091110). Googles Go: A New Programming Language Thats Python Meets C++. TechCrunch. https://techcrunch.com/2009/11/10/google-go-language/ 2010118 

(五)^ Language Design FAQ. go.dev (2010116). 2010227

(六)^ Metz, Cade (201155). Google Go boldly goes where no code has gone before. The Register. 2018724

(七)^ go.dev

(八)^ go installation guide

(九)^ Go version 1 is released (2012328). 2012329

(十)^ Go 1.4Android (20141212). 2015826

(11)^ Go 1.5 is released (2015819). 2015826

(12)^ Google App Engine Blog, Tuesday, May 10, 2011

(13)^ Go 1.11 is released. The Go Blog (2018824). 2018104

(14)^ abcFrequently Asked Questions (FAQ) - The Go Programming Language

(15)^ Hey! Ho! Let's Go!. Google Open Source. Google. 2018517

(16)^ Gerrand. Go version 1 is released - The Go Blog. 201824 Shankland, Stephen (2012330). Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google.. CBS Interactive Inc (2012-03-30). https://www.cnet.com/news/googles-go-language-turns-one-wins-a-spot-at-youtube/ 201786. "Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++."  Release History. 2018724

(17)^ Go FAQ: Is Google using Go internally?. https://go.dev/doc/faq#Is_Google_using_go_internally 201339 

(18)^ Google's In-House Programming Language Now Runs on Phones. wired.com (2015819). 2018724

(19)^ Go 1.5 Release Notes. 2016128 The compiler and runtime are now implemented in Go and assembler, without C. Go 1.5AndroidiOS (2015824). 2015826

(20)^ FAQ: Implementation. go.dev (2010116). 2010118 Installing GCC: Configuration. 2011123 Ada, Go and Objective-C++ are not default languages

(21)^ Pike, Rob (2010428). Another Go at Language Design. Stanford EE Computer Systems Colloquium. Stanford University. 2018724 Video available.

(22)^ Frequently Asked Questions (FAQ) - The Go Programming Language. go.dev. 2016226

(23)^ Andrew Binstock (2011518). Dr. Dobb's: Interview with Ken Thompson. 201427 Pike, Rob (2012). Less is exponentially more. 2018724 Robert Griesemer (2015). The Evolution of Go. 2018724

(24)^ Go 1.6 Release Notes - The Go Programming Language

(25)^  (2016219). Go 1.6. 2016220

(26)^ Cox, Russ. Toward Go 2 - The Go Blog. 201824

(27)^ Go 1.17 is released - go.dev. go.dev. 2021919

(28)^ Chisnall, David (2012). The Go Programming Language Phrasebook. Addison-Wesley. https://books.google.com/books?id=scyH562VXZUC 

(29)^ abhttps://go.dev/doc/faq

(30)^ Go 1.9 Release Notes - The Go Programming Language

(31)^ reflect - The Go Programming Language

(32)^ §Implementation | Frequently Asked Questions (FAQ) - The Go Programming Language

関連項目

編集

解説書籍など

編集

mattn2 GoISBN 978-4-297-10727-7201981

Alan A.A.Donovan, Brian W.Kernighan   GoISBN 978-4-621-30025-12016620

Gotourgo-langgo install golang.org/x/website/tour@latesttourGo

外部リンク

編集