在Golang中无法返回值。

huangapple go评论73阅读模式
英文:

Can't return value in Golang

问题

我是你的中文翻译助手,以下是翻译好的内容:

我对golang还不熟悉,不明白为什么不能返回一个值。我觉得这可能是一个小错误。我只是想返回我从数据库中选择的一个字符串。

func myFunction() string {

    rows, err := db.Query("SELECT my_string ORDER BY agents_count ASC LIMIT 1;")
    if err != nil {
        logger.Fatal(err)
    }

    defer rows.Close()

    for rows.Next() {
        var my_string string

        if err := rows.Scan(&my_string); err != nil {
            logger.Fatal(err)
        }
        
        logger.Info("Result : ", my_string)
    }
    if err := rows.Err(); err != nil {
        logger.Fatal(err)
    }

    return my_string
}

有什么想法吗?我犯了什么错误?

英文:

I'm new to golang and I dont get why I can't return a value. I think it's a small mistake. I just want to return a string I picked in a DB.

func myFunction() string {

	rows, err := db.Query("SELECT my_string ORDER BY agents_count ASC LIMIT 1;")
    if err != nil {
        logger.Fatal(err)
    }

    defer rows.Close()

    for rows.Next() {
        var my_string string

        if err := rows.Scan(&my_string); err != nil {
            logger.Fatal(err)
        }
        
        logger.Info("Result : ", my_string)
    }
    if err := rows.Err(); err != nil {
        logger.Fatal(err)
    }

    return my_string
}

Any idea ? What is my mistake ?

答案1

得分: 1

只需将my_string移动到外部循环即可。

func myFunction() string {

    rows, err := db.Query("SELECT my_string ORDER BY agents_count ASC LIMIT 1;")
    if err != nil {
        logger.Fatal(err)
    }

    defer rows.Close()

    var my_string string

    for rows.Next() {

        if err := rows.Scan(&my_string); err != nil {
            logger.Fatal(err)
        }
        
        logger.Info("Result : ", my_string)
        
        // 在此处使用my_string
        
    }
    if err := rows.Err(); err != nil {
        logger.Fatal(err)
    }

    return my_string
}
英文:

Just move my_string to outer loop

func myFunction() string {

    rows, err := db.Query("SELECT my_string ORDER BY agents_count ASC LIMIT 1;")
    if err != nil {
        logger.Fatal(err)
    }

    defer rows.Close()

    var my_string string

    for rows.Next() {

        if err := rows.Scan(&my_string); err != nil {
            logger.Fatal(err)
        }
        
        logger.Info("Result : ", my_string)
    }
    if err := rows.Err(); err != nil {
        logger.Fatal(err)
    }

    return my_string
}

答案2

得分: 1

当你选择单行时(使用LIMIT 1),你应该使用QueryRow方法或者较新的QueryRowContext方法,而不是使用Query方法。

func myFunction() string {
	var my_string string
	
	row := db.QueryRow("SELECT my_string ORDER BY agents_count ASC LIMIT 1;")
	if err := row.Scan(&my_string); err != nil {
		logger.Fatal(err)
	}
	
	return my_string
}
英文:

When selecting a single row as you are doing (using LIMIT 1), instead of Query you should use the QueryRow method or, the newer, QueryRowContext method.

func myFunction() string {
	var my_string string
	
	row := db.QueryRow("SELECT my_string ORDER BY agents_count ASC LIMIT 1;")
	if err := row.Scan(&my_string); err != nil {
		logger.Fatal(err)
	}
	
	return my_string
}

huangapple
  • 本文由 发表于 2021年9月1日 16:01:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/69009932.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定