強くなりたい

毎日無意識に生きてて良くない

Go言語について

目次

package,module等について

以下のサイトがわかりやすい。

【Go】パッケージ/モジュールやgo modコマンドについてまとめ - フラミナル

配列、sliceの値渡し・参照渡しについて

Goのarrayとsliceを理解するときがきた - Qiita

↑これがめちゃめちゃわかりやすかった。
arrayは数が並んでいるだけのただの値でsliceはarrayへの参照を持つデータ構造らしい。
これからずっとこのことを念頭に置いた上でコーディングしようと思う。(そうすればいつのまにか無意識のうちに区別がついてそう)

また、次の記事も面白かった。ややこしいが上の記事を読んだ後だとすんなり理解できる。
Go の Slice の落とし穴 - Qiita

GoのSliceもヤバイ - Qiita

結局とっつきにくかったsliceのcapacityという概念もsliceを正しく理解することでなんとなく実体がつかめた気がする。

文字列操作がうまくいかない

package main

import "fmt"

func main() {
    S := "abc"
    var slice []string
    slice = append(slice,S)  //これはうまくいく
    fmt.Println(slice)
    slice = append(slice, S[0]) //これはうまくいかない
    fmt.Println(slice)
}

なぜかわかってない。わかったら追記する。 ここから実行できる↓
Go Playground - The Go Programming Language

追記
解決した。原因はS[0]の型がuint8になっていたことだった。 それを改めてstring型に戻すと正しく動作する。

package main

import (
    "fmt"
)

func main() {
    S := "abc"
    var slice []string
    slice = append(slice, S)                  //これはうまくいく
    fmt.Println(slice)                        //slice = [abc]
    fmt.Printf("S[0]のtypeは"+"%T\n", S[0])   // S[0]のtypeはuint8
    slice = append(slice, string(S[0]))       //string型に戻す
    fmt.Println(slice)                        //slice = [abc,a]
}

Sliceなんもわからん

この問題を解こうとしたときのことである。 B - Booby Prize

package main

import (
    "fmt"
    "sort"
)

func main() {
    // n = 6
    // 各スコアが 1 123 12345 12 1234 123456 のとき
    var n int
    fmt.Scan(&n)
    slice := make([]int, n)
    for i := 0; i < n; i++ {
        var a int
        fmt.Scan(&a)
        slice = append(slice, a)
    }
    // この時点でslice = [0 0 0 0 0 0 1 123 12345 12 1234 123456]
    // 本当は slice = [1 123 12345 12 1234 123456]であってほしかった
    sort.Ints(slice)
    fmt.Println(slice[2])
    // 当然ここもうまくいかずslice[2] = 0が出力される
}

普通に入力受け取ってソートして出力じゃい!ってやったらうまくいかなかったからいろいろ弄ったらこんなことが起こった。何勝手にサイズ変わっとんねん!といいたくなるが可変長配列だから仕方ないことなのだろうか。

疑問

  • 配列の一部分を切り取ったものを値渡しとして受け取ることはできないのか?