在此示例中,为什么我们返回一个指针而不是一个值?

时间:2018-08-05 15:33:08

标签: go

package main

import "fmt"


type argError struct {
    arg  int
    prob string
}

func (e *argError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.prob)
}

func f2(arg int) (int, error) {
    return -1, &argError{arg, "can't work with it"}
}

func main() {

    _, e := f2(42)
    if ae, ok := e.(*argError); ok {
        fmt.Println(ae.arg)
        fmt.Println(ae.prob)
    }
}

在f2中,我们将指针&argError ... 作为返回值,但声明为返回 error 的方法。为什么f2签名未定义为

func f2(arg int)(int, *错误)?还是为什么在这种情况下我们不返回指针?

1 个答案:

答案 0 :(得分:4)

错误是要求使用public ArrayList<String> getX_axis(){ ArrayList<String> Xval = new ArrayList<String>(); open(); mDatabase = mDBHelper.getReadableDatabase(); Cursor x_cursor = mDatabase.rawQuery("SELECT ORDER_DATE FROM TABLE_ORDER WHERE ITEM_ID =? GROUP BY ORDER_DATE",new String[]{"'198'"}); try{ if(x_cursor!= null){ if(x_cursor.moveToFirst()){ do { String levelData = x_cursor.getString(x_cursor.getColumnIndexOrThrow("ORDER_DATE")); Xval.add("" + levelData); } while (x_cursor.moveToNext()); } } } catch (SQLException e){ Log.e("Retrieve data","Unable to get Data"+ e); } x_cursor.close(); close(); return Xval; } public ArrayList<String> getY_axis(){ open(); mDBHelper.getReadableDatabase(); ArrayList<String> Yval = new ArrayList<String>(); Cursor y_cursor = mDatabase.rawQuery("SELECT COUNT(ITEM_ID) FROM TABLE_ORDER WHERE ITEM_ID =? GROUP BY ORDER_DATE",new String[]{"'198'"}); try{ if(y_cursor!= null){ if(y_cursor.moveToFirst()){ do { String levelData = y_cursor.getString(y_cursor.getColumnIndexOrThrow("ITEM_ID")); Yval.add(""+levelData); } while (y_cursor.moveToNext()); } } } catch (SQLException e){ Log.e("Retrieve data","Unable to get Data"+ e); } y_cursor.close(); close(); return Yval; } }方法的接口。

这里的问题是您在指针上声明了Error() string方法。 Error() string,因此只有func (e *argError) Error() string实现了*argError,而没有实现error。因此,您只能返回argError

您应该知道指针的&argError{...}*error是不同的。前者是一个指向error的指针,该指针保存任何具体类型,而后者是一个interface保持指针的指针。

在实践中,由于interface与方法有关,所以指向interface的指针很少有用,而广泛使用持有指针的interface