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, *错误)?还是为什么在这种情况下我们不返回指针?
答案 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
。