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

#ifndef __GoStructs_H__
#define __GoStructs_H__

#include <Foundation/Foundation.h>
#include "GoUniverse.h"

@class GoStructsS;
@class GoStructsS2;
@protocol GoStructsI;
@class GoStructsI;

@interface GoStructsS : NSObject {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (double)x;
- (void)setX:(double)v;
- (double)y;
- (void)setY:(double)v;
- (BOOL)identity:(GoStructsS**)ret0_ error:(NSError**)error;
- (double)sum;
@end

@interface GoStructsS2 : NSObject {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (void)m;
- (NSString*)string;
@end

@protocol GoStructsI
- (void)m;
@end

FOUNDATION_EXPORT GoStructsS* GoStructsIdentity(GoStructsS* s);

FOUNDATION_EXPORT BOOL GoStructsIdentityWithError(GoStructsS* s, GoStructsS** ret0_, NSError** error);

@class GoStructsI;

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

- (id)initWithRef:(id)ref;
- (void)m;
@end

#endif
