使用中となって操作できないファイルの原因探求

golangで適当なパッケージを作っていて、パッケージをリネームしようとしたらよくあるエラーが発生しました。

「別のプログラムがこのフォルダーまたはファイルを開いているので、操作を完了できません。」

最悪OS再起動でどうにかなりますが頻発すると面倒なので原因を見つける方法を書いておきます。

環境、バージョン情報は以下です。

windows10 go 1.12 Visual Stadio Code 1.36.1 Go for Visual Studio Code 0.11.4

続きを読む 使用中となって操作できないファイルの原因探求

【GO】組み込み関数について(new, make, delete等々)

newmakeを使って変数宣言したりappendを使ってスライスの追加なんかを自然とやってきたけど、ふとこれは何だっけと思って調べてみました。

するとビルトインパッケージとして参照することができた。

ソースを見た感じgodoc用に見えるので中身は説明を読んで使ってみる必要がある。

この辺は知らないと使えないものなのでおさらいしておきます。

標準出力

  • func print(args …Type)
  • func println(args …Type)

fmt.Printfmt.Printlnと似たような動きちょっとした出力用途で使える。

ただ自動で型推定なんかはしてくれないので結局fmtを使うことになると思う。

メモリ(容量)管理系

  • func new(Type) *Type
  • func make(t Type, size …IntegerType) Type

混同しやすいけどnewはゼロ値で確保された値へのポインタを得る関数で、makeはマップ、スライス、チャンネル(map[type]type, []type, chan)の確保と初期化を行い型そのものを得る関数です。

この3つは型そのものがポインタを持っているのでmakeで型を得ています。

それ以外のstruct定義したものなんかは容量を気にして渡しやすいポインタをnewで得る思っておけばとりあえず間違いはないはず。

 

試しにスライスでこんなことをする。

newで確保した場合のサイズは8(つまりポインタだけ)ですね。

スライスはpointer, len(int), cap(int)の24バイトとなるのが正しい動作です。

まあnewで作ってもこんな風に使っていけなくもないですが。

 

  • func append(slice []Type, elems …Type) []Type
  • func copy(dst, src []Type) int

スライスの追加とコピーの関数です。

appendは確保した容量に追加する形の非破壊的な関数です。

copyはいわゆるディープコピー。スライスは型ですが中身のポインタが代入されるため参照渡しのようになってしまいます。

そこでcopyですが、する側の容量がされる側の容量より大きくないとindex out of rangeエラーになります。

また大きい部分に関しては無視されます。

ちなみにスライスに削除はないので使わない方法を探すか実装の必要があります。

 

  • func delete(m map[Type]Type1, key Type)

マップの削除に使います。

スライスで削除できないこともあって、個人的には順不同ならmapを使うことが多いです(rangeではmapの順序は保証されない)。

 

  • func cap(v Type) int
  • func len(v Type) int

capはメモリ確保した長さでlenは汎用的な長さを返す関数です。

この例のスライスはappendによるメモリ再確保で11までの領域が使用可能になり、元の10の倍の20分のメモリが確保されています。

型ごとに動作が違うので詳しくは原文参照。

説明抜き出し
cap

Array: the number of elements in v (same as len(v)).
Pointer to array: the number of elements in *v (same as len(v)).
Slice: the maximum length the slice can reach when resliced;
if v is nil, cap(v) is zero.
Channel: the channel buffer capacity, in units of elements;
if v is nil, cap(v) is zero.

len

Array: the number of elements in v.
Pointer to array: the number of elements in *v (even if v is nil).
Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
String: the number of bytes in v.
Channel: the number of elements queued (unread) in the channel buffer;
if v is nil, len(v) is zero.

 

  • func close(c chan<- Type)

チャンネル終了用。

make(chan Type)したものはちゃんとcloseさせましょう。

例外

  • func panic(v interface{})
  • func recover() interface{}

ルーチンを止めたり、復帰させたりする。

通常用途ではあまり使うべきものでもない。

複素数

  • func complex(r, i FloatType) ComplexType
  • func real(c ComplexType) FloatType
  • func imag(c ComplexType) FloatType

これも普段使う機会はないけど複素数作成用と実数、虚数の取得用。

【GO】個人用途のライブラリを管理する

golang開発をする中で公開する予定のない私的なライブラリ(パッケージ)をどう扱うか迷っています。

以前は適当なフォルダにまとめておいて相対パスで読み込んでいましたが、modulesで管理するようになってからはプロジェクト下に置く必要が出てきて使うものを都度コピペしていました。

プロジェクトごとに微妙に違う似たようなパッケージが生産され、そろそろ管理できなそうなのでGithubのプライベートリポジトリで管理する方法を試します。

続きを読む 【GO】個人用途のライブラリを管理する

【GO】ファイルシステムを走査する

特定の場所のフォルダ、ファイル一覧を走査(トラバース)する方法のメモ。

何かしらのファイル加工ツールを作るときに役立つかもしれない。

続きを読む 【GO】ファイルシステムを走査する

Linuxサーバーで自作WEBアプリを管理する

GolangのWebパッケージginを用いて作ったWEBアプリをLinuxサーバーで公開するためのメモ。ポートとかの話の続きです。

今回はアプリ永続化のための部分。

一度実行したらアップデートなどで止めるまで動き続けてくれるようにします。

Linux環境: Ubuntu 16.04.5

続きを読む Linuxサーバーで自作WEBアプリを管理する

【GO】外部パッケージのレシーバ定義

golangではtypeによる型定義とレシーバと呼ばれるメソッド定義ができます。

複数の外部パッケージを同時使用するときなどにレシーバ追加をしたいときがあるんですが、言語規則のためそのままだと追加できません。

基本的なことからおさらいしつつ対策を考えます。

続きを読む 【GO】外部パッケージのレシーバ定義

【GO】WordPress(Apache)とginを同時に動かす

bitnamiのwordpressが動いているサーバーにgolangのWEBサービスを追加します。

アプリ自体は8080ポートで実行してサブディレクトリにマップする形です。

Apacheで他WEBサーバーを動かす場合も同様のやり方で行けると思います。

続きを読む 【GO】WordPress(Apache)とginを同時に動かす

【GO】ginで作ったWEBサービスを利用可能にする

LinuxサーバーでWEBアプリを公開する際のメモ。

単体で公開したり、ポートを分けて公開したり、サブディレクトリで公開したり。

続きを読む 【GO】ginで作ったWEBサービスを利用可能にする