我查找了一下Golang是什么意思

大约半年前,我开始随便写写Go语言。因为工作中总是写Java,所以我想换个心情来写写Go,但既然开始了,我想要彻底理解这门语言的特性,就开始了解一下Go语言。

【参考网站】
– Golang官方(常见问题)
– 以Go语言为主题的文章:什么是Go语言的特点?
– 关于Golang并发处理的易于理解的文章

Golang的起源

    • 動的型付け言語のプログラミング容易性、静的型付け言語の安全性・効率的なコンパイルを一つの言語で享受したい。

 

    • マルチコアプロセッサを生かした優れた非同期処理による実行効率を目指した。

 

    本当に開発者が必要だと思う機能のみを提供するように、言語仕様をリッチにしないことにより、開発者の迷いを無くし、生産性の高い開発をサポートしたい。

Go语言的强大功能

界面

golangのinterfaceはinterfaceに定義したメソッドを実装しただけでinterfaceを実装していると見なされる。
これはinterfaceを「ある概念を表すための振る舞いを定義するもの」としてではなく「概念を扱う側がどう扱いたいかを定義するもの」として扱えるということだと理解。
「依存性逆転の法則」を正確に、コンパクトに実現できるようになっている。

package main

import (
    "fmt"
    "strconv"
)

// メイン処理
func main() {
    PrintGame(Soccer{11, "サッカー", 120})
    PrintGame(Chess{9, "チェス", 9})
}

func PrintGame(g Game) {
    fmt.Println(g.getGameName() + "は" + strconv.Itoa(g.getPlayerMemberCount()) + "人で行うゲームです")
}

// ゲームインターフェース(メイン処理で使いたいもののみを定義)
type Game interface {
    getPlayerMemberCount() int
    getGameName() string
}

// サッカー構造体
type Soccer struct {
    playerMemberCount int
    gameName          string
    playTime          int
}

func (s Soccer) getPlayerMemberCount() int {
    return s.playerMemberCount
}

func (s Soccer) getGameName() string {
    return s.gameName
}

// チェス構造体
type Chess struct {
    playerMemberCount int
    gameName          string
    boardSize         int
}

func (c Chess) getPlayerMemberCount() int {
    return c.playerMemberCount
}

func (c Chess) getGameName() string {
    return c.gameName
}

func (c Chess) getBoardSize() int {
    return c.boardSize
}

構成

    • 継承という概念を無くし、オブジェクト志向言語として扱いたい場合に、継承ではなく移譲を強制し、コードの複雑さを取り払う。

 

    個人的には多重継承された実装は可読性が低く、スパゲティコードの温床になり得ると思っているので、この仕様は好み。
package main

import (
    "fmt"
    "time"
)

// メイン処理
func main() {
    order := Order{"パン", OrderDetail{100, "buy", time.Now()}}
    fmt.Println(order.getItemName())
    // 注文に埋め込んだ構造体のメソッドを直接呼び出せる
    fmt.Println(order.getOrderPrice())
    fmt.Println(order.getBuySellType())
    fmt.Println(order.getOrderDateTime())
}

// 注文構造体
type Order struct {
    itemName string
    // 注文明細を注文に埋め込み
    OrderDetail
}

func (o Order) getItemName() string {
    return o.itemName
}

// 注文明細構造体
type OrderDetail struct {
    orderPrice    int
    buySellType   string
    orderDateTime time.Time
}

func (d OrderDetail) getOrderPrice() int {
    return d.orderPrice
}

func (d OrderDetail) getBuySellType() string {
    return d.buySellType
}

func (d OrderDetail) getOrderDateTime() time.Time {
    return d.orderDateTime
}

异步处理

在Golang中,实现了可以进行并发处理的功能goroutine。goroutine是一种执行”并行处理”而不是”并列处理”的功能。(由于自己对这个概念也感到模糊不清,所以借此机会要好好理解一下。。)

据说goroutine在与其他语言的并发处理相比具有两个优点。

    • 並行処理の確保するメモリが軽量

 

    並行処理の実行速度

我对这两点进行了调查。

保证轻量级的内存并行处理

由于一个goroutine在启动时所分配的内存容量和内存分配的方法。
通常情况下,当我们启动多个线程进行处理时,为了确保各个线程之间不互相干扰,我们会为每一个线程分配一个较大的内存区域(大约1MB)。

据说相比之下,goroutine只需在堆栈中分配约2KB的存储空间。之后,它会根据goroutine所需的内存,将其分配到堆区,以便作为goroutine的功能去运行。

因此,要建立成千上万个线程需要大量的内存,但如果使用goroutine的话就不必担心这个问题。这是我认为的。

并行处理的执行速度

这是因为与线程相比,goroutine在进行上下文切换时的成本较低。线程需要将正在处理的数据从多个寄存器保存到多个寄存器的操作,而goroutine只需保存3至4个寄存器即可。

此外,goroutine调度器被设计用于在检测到goroutine的阻塞处理时开始执行另一个goroutine的处理,以避免浪费系统资源。

最後

我已经记录了我在调研Golang功能和设计思想方面的结果,但在调研过程中,我感觉到它是一门非常精简的语言。
在工作中,我们使用Java,它提供了许多有用的功能和用于通用实现的功能。
然而,包括我在内的许多成员并没有完全掌握使用Java的这些功能。
事实上,我们可能因为使用这些功能而生产出难以维护的代码。

由于这个原因,即使有人讥讽Go语言没有趣味,我仍然认为接触一种能够强制我们以高效方式书写易于维护的代码的语言是有益的学习经验。我将继续把Go语言作为我的兴趣,并不断写下去。

bannerAds