我用
http://github.com/dutchcoders/goftp通过FTP发送文件.它正常工作,但当我想上传文件并获取该文件信息(同时)它不起作用!
fileName := "sth"
var err error
var ftp *goftp.FTP
if ftp, err = goftp.Connect("serverip:port"); err != nil {
fmt.Println(err)
}
defer ftp.Close()
config := tls.Config{
InsecureSkipVerify: true,
ClientAuth: tls.RequestClientCert,
}
if err = ftp.AuthTLS(config); err != nil {
// log.Println("1", err)
}
if err = ftp.Login("userName", "pass"); err != nil {
log.Println("2", err)
}
//
if err = ftp.Cwd("/home/myDir/"); err != nil {
log.Println("3", err)
}
var file *os.File
if file, err = os.Open(fileName); err != nil {
log.Println("6", err)
}
defer file.Close()
fmt.Println("start")
go func() {
fmt.Println("first")
nmp := ftp.Stor(fileName, file)
if nmp != nil {
log.Println("7", err)
} else {
fmt.Println("first is runung")
}
}()
go func() {
fmt.Println("second")
for {
files, nms := ftp.List(fileName)
if nms == nil {
fmt.Println(files)
}
time.Sleep(1 * time.Second)
}
}()
fmt.Println("end")
var mnmn string
fmt.Scan(&mnmn)
ftp.Stor func将无法运行,我的代码返回低于输出:
06001
最佳答案 目前,两个goroutine都有相同的ftp实例(var ftp * goftp.FTP
因为他们有竞争条件而互相阻挡.而你的结果是不可预测的.有时,它会在第一次正确执行时给出正确的结果.或者当它等待第二个然后完全运行时.或者当第一次没有执行时.否则,go例程都会相互阻塞.
Solutons:
>您使用两个不同的ftp实例来提供与goroutine的不同连接
var ftp,ftp1 *goftp.FTP
像这里Play Golang
要么
>在主要的日常工作中首先拥有* goftp stor.然后开始其他日常工作.但它会破坏第二次例程的目的.