ホームページ > バックエンド開発 > Golang > golangは変更できます

golangは変更できます

WBOY
リリース: 2023-05-06 10:27:07
オリジナル
498 人が閲覧しました

Golang は変更可能: Golang の多様性を探る

Golang (Go とも呼ばれる) は、近年ますます人気が高まっているプログラミング言語です。 Golang の主な設計目標は、高いパフォーマンスと信頼性を維持しながら、開発効率とコードの可読性を向上させることです。他の言語と比較して、Golang は独自の設計とデータの変動性の処理を備えています。この記事では、Golang の多様性について調査し、これに基づいて、Golang の基本的な設計上の考え方と、遭遇する可能性のあるいくつかの問題について検討します。

Golang では、データ型は値型と参照型に分類されます。値の型には整数、浮動小数点数、ブール値などが含まれ、それらの値はスタック メモリに格納されます。参照タイプには、スライス、構造体、関数などが含まれます。それらの値はヒープ メモリに格納され、ポインタを介してスタック上で参照されます。

まず、値の型の変動性を見てみましょう。 Golang では値の型を変更できますが、この変更は現在のスコープ内でのみ発生します。例:

package main

import "fmt"

func main() {
    i := 1
    fmt.Println(i) // 输出 1

    modify(i)
    fmt.Println(i) // 仍然输出 1
}

func modify(i int) {
    i = 2
}
ログイン後にコピー

この例では、modify 関数の i の値を変更すると、modify# の内部にのみ影響することがわかります。 main 関数の i に影響を与えずに ## 関数変数を使用できます。これは、関数の呼び出し時に値の型がコピーされ、関数内で変更されるのはコピーされた値のみであるためです。

対照的に、参照型には、関数が呼び出されるときに参照 (メモリ アドレスへのポインター) が渡されます。したがって、関数内で参照型を変更すると、その参照型が指すアドレスに格納されている値に影響します。例:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Tom", 18}
    fmt.Println(p) // 输出 {Tom 18}

    modify(&p)
    fmt.Println(p) // 输出 {Jerry 20}
}

func modify(p *Person) {
    p.Name = "Jerry"
    p.Age = 20
}
ログイン後にコピー
この例では、

Person 構造体を定義し、main 関数でインスタンス化します。次に、この構造体のポインタを modify 関数に渡し、modify 関数でこの構造体インスタンスの値を変更します。ご覧のとおり、main 関数で出力される構造は {Jerry 20} に変更されています。

しかし、値の型と参照型の関係はそれほど単純ではない場合があります。たとえば、Golang には

string という型がありますが、これは実際には読み取り専用の参照型です。つまり、string 変数の場合、その内部値を直接変更することはできません。例:

package main

import "fmt"

func main() {
    s := "hello"
    fmt.Println(s) // 输出 hello

    modify(s)
    fmt.Println(s) // 仍然输出 hello
}

func modify(s string) {
    s = "world"
}
ログイン後にコピー
この例では、

modify 関数で string 型の値を変更しようとしましたが、有効になりませんでした。これは、string 型が読み取り専用であり、関数の呼び出し時にコピーされるため、パラメーターを変更しても元の string 変数には影響しません。 string 型の値を変更する場合は、書き込み可能な []byte 型に変換する必要があります。たとえば、

package main

import "fmt"

func main() {
    s := "hello"
    fmt.Println(s) // 输出 hello

    modify(&s)
    fmt.Println(s) // 输出 world
}

func modify(s *string) {
    b := []byte(*s)
    b[0] = 'w'
    *s = string(b)
}
ログイン後にコピー
この例では、

string 型のポインタを modify 関数に渡し、関数内でそれを型 []byte に変換し、最後の文字を変更して再度変換します。 文字列タイプ。このメソッドは string 型の変更を実現できますが、コードが複雑になります。

Golang は設計時にデータの変動性を考慮し、それに応じた設計を行います。 Golang では、グローバル変数や予測できない関数呼び出しの使用を避けるようにしてください。同時に、Golang の組み込み関数は純粋な関数であり、いかなる変更も加えられません。これらの設計により、Golang コードの理解と保守が容易になると同時に、コード実行時のリスクも軽減されます。

要約すると、Golang 値型への変更は現在のスコープにのみ影響しますが、参照型への変更はポイントされたアドレスに格納されている値を変更します。

string 型を変更する場合は、その読み取り専用機能に注意する必要があります。[]byte 型を使用して変換および変更できます。 Golang の設計思想と処理方法は、コードの可読性と信頼性を重視していることを反映しています。 Golang の開発では、その可変性の特性を十分に理解し、その設計思想と処理方法に徐々に適応して、コードの品質と効率を向上させる必要があります。

以上がgolangは変更できますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート