// Objective-C API for talking to interfaces Go package.
//   gobind -lang=objc interfaces
//
// File is generated by gobind. Do not edit.

#ifndef __GoInterfaces_H__
#define __GoInterfaces_H__

@import Foundation;
#include "GoUniverse.h"


@protocol GoInterfacesError;
@class GoInterfacesError;
@protocol GoInterfacesI;
@class GoInterfacesI;
@protocol GoInterfacesI1;
@protocol GoInterfacesI2;
@protocol GoInterfacesI3;
@class GoInterfacesI3;
@protocol GoInterfacesLargerI;
@class GoInterfacesLargerI;
@protocol GoInterfacesSameI;
@class GoInterfacesSameI;
@protocol GoInterfacesWithParam;
@class GoInterfacesWithParam;

@protocol GoInterfacesError <NSObject>
- (BOOL)err:(NSError**)error;
@end

@protocol GoInterfacesI <NSObject>
- (int32_t)rand;
@end

@interface GoInterfacesI1 : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)j;
@end

@interface GoInterfacesI2 : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)g;
@end

@protocol GoInterfacesI3 <NSObject>
- (GoInterfacesI1*)f;
@end

@protocol GoInterfacesLargerI <NSObject>
- (void)anotherFunc;
- (int32_t)rand;
@end

@protocol GoInterfacesSameI <NSObject>
- (int32_t)rand;
@end

@protocol GoInterfacesWithParam <NSObject>
- (void)hasParam:(BOOL)p0;
@end

FOUNDATION_EXPORT int32_t GoInterfacesAdd3(id<GoInterfacesI> r);

FOUNDATION_EXPORT BOOL GoInterfacesCallErr(id<GoInterfacesError> e, NSError** error);

FOUNDATION_EXPORT id<GoInterfacesI> GoInterfacesSeven();

@class GoInterfacesError;

@class GoInterfacesI;

@class GoInterfacesI3;

@class GoInterfacesLargerI;

@class GoInterfacesSameI;

@class GoInterfacesWithParam;

@interface GoInterfacesError : NSObject <goSeqRefInterface, GoInterfacesError> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (BOOL)err:(NSError**)error;
@end

@interface GoInterfacesI : NSObject <goSeqRefInterface, GoInterfacesI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (int32_t)rand;
@end

@interface GoInterfacesI3 : NSObject <goSeqRefInterface, GoInterfacesI3> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (GoInterfacesI1*)f;
@end

@interface GoInterfacesLargerI : NSObject <goSeqRefInterface, GoInterfacesLargerI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)anotherFunc;
- (int32_t)rand;
@end

@interface GoInterfacesSameI : NSObject <goSeqRefInterface, GoInterfacesSameI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (int32_t)rand;
@end

@interface GoInterfacesWithParam : NSObject <goSeqRefInterface, GoInterfacesWithParam> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)hasParam:(BOOL)p0;
@end

#endif
