![見出し画像](https://assets.st-note.com/production/uploads/images/142784572/rectangle_large_type_2_78c32665357c6f5499dab231e7c2c157.png?width=1200)
まずはProgate! ポインタまで 🤔
こんにちは、ひとりです!😊まずは1週間、しっかり勉強継続できました🥳🥳🥳
小さなハードルでもひとつひとつ積み上げていけば今まで見えなかった景色まで届くと信じて、コツコツあせらず基礎から進めています👩🏻💻
とはいえ何を作ろうかなかなかアイデアも浮かんでこないので、まずはということでProgateの有料コースに登録してGo言語の基礎をひととおり学ぶことにしました。
レッスン3の関数のあたりまではサクサクと進めることができたのですが、レッスン4の「ポインタとアドレス」のところでちょっと混乱しはじめて手が止まってしまいました…🧐
ポインタって何? 📍
ポインタ = データそのものではなく、データのおいてあるところのアドレス
…って言われてピンとくるなら苦労しないですよね🙃
とはいえ、Progateで「関数のスコープを越えた値の更新」ができたとき、おっ、こいつは使えるぞ…!となりました。
はじめはなにこれ、厄介だし難しくない…?と思ったのですが、この記事でまとめているうちにさらにわかってきた気がします✌️
なぜポインタが必要なの? 🤷♀️
ポインタを使うと、関数のスコープを超えて値を渡すことができます。
たとえば a という変数があるときに、値を代入したりすることは簡単だと思います。
この a という変数にいろいろな操作をしたい…と思ったとき、関数の中にいろんな処理をつめこみたくなりますよね。
ですが、外にある関数で a の値を更新しようとすると、戻り値をつかって値を更新する必要があります。なので、関数のアウトプットとなる値の型と変数を事前に定義しないといけなくなってしまい、ただそこにあるものを更新するだけなのに、値を渡すための変数定義とreturnを追加する必要があってごちゃごちゃしそうでした。
…って言葉で説明しても何が言いたいのかわからなくなるので、サンプルコードを書いてみました!
(これで伝わりやすかったらすごくプログラマーっぽくて嬉しい…☺️)
https://go.dev/play/p/LHbf9S-_mEh
package main
import "fmt"
func main() {
a := 10
b := &a // 変数aのアドレスをポインタbに格納
fmt.Println("変数aの値:", a)
fmt.Println("ポインタbの正体はアドレス:", b) // ポインタbを表示
fmt.Println("ポインタbが指している値:", *b) // ポインタbを使ってaの値を取得
update_value(a) // 値を関数に渡す
fmt.Println("update_valueに値だけ渡す結果, aの新しい値:", a)
a = update_value(a) // 値を関数に渡し、自分に代入して更新
fmt.Println("update_valueを代入した結果, aの新しい値:", a)
update_pointer(b) // ポインタを関数に渡す
fmt.Println("aの新しい値:", a) // 関数内でのポインタによる変更が反映されてる!
}
func update_value(target int) int {
fmt.Println("///update_value///")
fmt.Println("関数targetに渡された値:", target)
fmt.Println("関数targetの中でのアドレス:", &target)
target = 15 // 値を変更
return target
}
func update_pointer(target *int) {
fmt.Println("///update_pointer///")
fmt.Println("関数targetに渡されたポインタ:", target)
fmt.Println("関数targetに入力された値:", *target)
*target = 20 // ポインタを使って値を変更、戻り値は不要
}
この例では、変数aと、そのアドレスを入れたポインタbを使っています。
戻り値で更新をするupdate_value()と、ポインタを通して更新するupdate_pointer()を作っています。
動作としては結局同じなのですが、update_pointerのほうがスッキリして見えます。
ちょっとした違いですが、たとえば処理したい値がたくさんあるような関数を想像すると、戻り値をいちいち指定する必要がなくなるだけで見栄えもよくなり更新もしやすくなるのかなあ、と初心者ながらに思いました🌱
はじめはとっつきづらかったポインタも、すこし理解ができたような気がしてきて、こういうちょっとわかった!っていう瞬間がプログラミングは楽しいですね🐣
応援よろしくお願いします!🌟
この記事が気に入ったらサポートをしてみませんか?