2016-10-06 10 views
0
package main 
import (
    "encoding/json" 
    "fmt" 
    "/something/models" 
    "os" 
    "path/filepath" 
    "runtime" 
) 

func WriteDeviceToFile(d chan *models.Device, fileName string) { 

_, b, _, _ := runtime.Caller(0) 
basepath := filepath.Dir(b) 
filePath := basepath + "/dataFile/" + fileName 

var f *os.File 
var err error 


f, _ = os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY, 0600) 

defer f.Close() 


for device := range d { 
    deviceB, err := json.Marshal(device) 
    fmt.Println(string(deviceB)) 
    if err == nil { 
     if _, err = f.WriteString(string(deviceB)); err != nil { 
      panic(err) 
     } 
    } else { 
     panic(err) 
    } 
} 

} 

func main() { 
deviceChan := make(chan *models.Device) 
go WriteDeviceToFile(deviceChan, "notalive.txt") 
d := models.NewDevice("12346", "") 
deviceChan <- d 
d = models.NewDevice("abcd", "") 
deviceChan <- d 
close(deviceChan) 
} 

これは、少なくとも2つのデバイスがチャネルに送信された場合にのみ機能します。 deviceChanに1つのデバイスしかない場合、関数は何も受信しません。 WriteDeviceToFileが取得される前にチャンネルが消えていますか?goでの奇妙なチャネル動作

+2

'main'が復帰すると、プログラムは終了します。ファイルが書き込まれる前に 'main'が終了しないようにするものはありません。 –

+0

そのように思われる。ありがとう。私はちょっと愚かな気分になります。私はそれを受け入れることができるように答えとしてそれを入れたいですか? – user3837980

答えて

1

mainが返ってくると、プログラムは終了します。ファイルが書き込まれる前にmainが終了しないようにしてください。