2017-02-19 60 views
1

嗨我在以下Go程序中遇到了兩個問題。
1.我無法使用Scanf或Scanln讀取空格分隔的字符串。
所以我添加了一個格式化的字符串「%q」來使用雙引號讀取空格分隔的字符串。 是否有替代閱讀字符串與空格?閱讀Golang中的空格分隔字符串1.8

package main 
import 
(
    "fmt" 
    "strings" 
) 

type details struct{ 
    DataType string 
    Table string 

} 
func main(){ 
    dt := details{} 
    fmt.Println("Enter the DataType") 
    fmt.Scanf("%q" ,&dt.DataType) 
    for strings.TrimSpace(dt.DataType) == "" { 
     fmt.Println("Enter the DataType") 
     fmt.Scanln(&dt.DataType) 
    } 
    //fmt.Println(dt.DataType) 
    fmt.Println("Enter the Table") 
    fmt.Scanln(&dt.Table) 
    for strings.TrimSpace(dt.Table) == "" { 
     fmt.Println("Enter a valid Table name ") 
     fmt.Scanln(&dt.Table) 
    } 
} 

控制檯輸出如下,

VenKats-MacBook-Air:ColumnCreator venkat$ go run test.go 
Enter the DataType 
"rid bigint not null" 
Enter the Table 
Enter a valid Table name 
  • 第二個問題是爲什麼控制流程走到第二個for循環,而不等待用戶輸入。帶有「%q」的Scanf返回卡拉格返回。 任何幫助,將不勝感激
  • +0

    讀取從輸入的線在Go有些非直觀,似乎很多初學者在那一個上絆倒了。看到這個問題的例子如何做到這一點:http://stackoverflow.com/q/20895552/723693 – ain

    +0

    有趣的是,輸入'數據類型'和''數據類型''有一個回車少於或超過必要! :\ –

    回答

    1

    也許是這樣..的重構的代碼

    package main 
    
    import (
        "bufio" 
        "fmt" 
        "os" 
        "strings" 
    ) 
    
    type details struct { 
        DataType string 
        Table string 
    } 
    
    func main() { 
        dt := details{} 
        cin := bufio.NewReader(os.Stdin) 
        for { 
         fmt.Println("Enter the DataType") 
         text, err := cin.ReadString('\n') // reads entire string up until the /n which is the newline deliminator 
         if strings.TrimSpace(text) == "" { // check to see if the input is empty 
          continue 
         } 
         if err == nil { // if the input is not empty then the control got this far and now we just have to check for error, assign the data, and break out of the loop .. repeat for the second input. If this is going to be something you do alot refactor the input section. 
          dt.DataType = text 
          break 
         } else { 
          fmt.Printf("An error as occured: %s\n", err.Error()) 
         } 
        } 
        for { 
         fmt.Println("Enter the Table") 
         text, err := cin.ReadString('\n') 
         if strings.TrimSpace(text) == "" { 
          continue 
         } 
         if err == nil { 
          dt.Table = text 
          break 
         } else { 
          fmt.Printf("An error as occured: %s\n", err.Error()) 
         } 
        } 
        fmt.Printf("%+v\n", dt) 
        return 
    } 
    

    實施例:

    package main 
    
    import (
        "bufio" 
        "fmt" 
        "os" 
        "strings" 
    ) 
    
    type details struct { 
        DataType string 
        Table string 
    } 
    
    func getInput(message string, reader bufio.Reader) (input string) { 
        for { 
         fmt.Println(message) 
         input, err := reader.ReadString('\n') 
         if strings.TrimSpace(input) == "" { 
          continue 
         } 
         if err == nil { 
          break 
         } else { 
          fmt.Printf("An error as occured: %s\n", err.Error()) 
         } 
        } 
        return 
    } 
    
    func main() { 
        dt := details{} 
        cin := bufio.NewReader(os.Stdin) 
        t := getInput("Enter the DataType", *cin) 
        dt.DataType = t 
        t = getInput("Enter the Table", *cin) 
        dt.Table = t 
        fmt.Printf("Seeing what my data looks like %+v\n", dt) 
        return 
    } 
    
    相關問題