開発環境
- macOS Catalina - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
os.Fileのソースを読んだら、意図がわからなくて無駄な処理としか思えないcheckValid関数を見つけて??の状態
— ゴリラ@バナナ不足中 (@gorilla0513) December 30, 2019
checkValidを呼べた時点でfがnilになることはありえないなはずで、そこでワザワザnilチェックする必要はないし、引数のopも使っていないから意味がない。
結局何をしたかったんだ… pic.twitter.com/BHrvYpvjav
nilでもメソッド呼べますよ
— おりさの (@orisano) December 30, 2019
ということで、変数の値がnilの変数でメソッドを呼び出してみた。それはどういうパターンですか?
— ゴリラ@バナナ不足中 (@gorilla0513) December 30, 2019
コード
package main
import "fmt"
type myInt int
func (*myInt) f() {
fmt.Println("Hello, nil!")
}
func main() {
a := myInt(10)
myIntPtr := &a
myIntPtr = nil
fmt.Println(myIntPtr == nil)
fmt.Printf("%T\n", myIntPtr)
myIntPtr.f()
}
入出力結果(Zsh、PowerShell、Terminal)
% go run main.go
true
*main.myInt
Hello, nil!
%
ということで、おりさのさんの言う通り、nilでもメソッドを呼び出せるみたい。ただ、ゴリラ@バナナ不足中さんの意味、意図が、checkValidを呼び出す他の関数やメソッドで、すでにnilかどうか検査してからcheckValidを呼び出してるからわざわざnilチェックする必要ないってことかも。 (⚠️os.Fileのソース、checkValidメソッドを呼び出す関数、メソッドを読んで調べてないからどっちかは分からず。)
0 コメント:
コメントを投稿