Go言語について
目次
package,module等について
以下のサイトがわかりやすい。
【Go】パッケージ/モジュールやgo modコマンドについてまとめ - フラミナル
配列、sliceの値渡し・参照渡しについて
Goのarrayとsliceを理解するときがきた - Qiita
↑これがめちゃめちゃわかりやすかった。
arrayは数が並んでいるだけのただの値でsliceはarrayへの参照を持つデータ構造らしい。
これからずっとこのことを念頭に置いた上でコーディングしようと思う。(そうすればいつのまにか無意識のうちに区別がついてそう)
また、次の記事も面白かった。ややこしいが上の記事を読んだ後だとすんなり理解できる。
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が出力される }
普通に入力受け取ってソートして出力じゃい!ってやったらうまくいかなかったからいろいろ弄ったらこんなことが起こった。何勝手にサイズ変わっとんねん!といいたくなるが可変長配列だから仕方ないことなのだろうか。
疑問
- 配列の一部分を切り取ったものを値渡しとして受け取ることはできないのか?