|  | // run -gcflags=-G=3 | 
|  |  | 
|  | // Copyright 2022 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package main | 
|  |  | 
|  | func returnOption[T any](n int) Option[T] { | 
|  | if n == 1 { | 
|  | return Some[T]{} | 
|  | } else { | 
|  | return None{} | 
|  | } | 
|  | } | 
|  |  | 
|  | type Option[T any] interface { | 
|  | sealedOption() | 
|  | } | 
|  |  | 
|  | type Some[T any] struct { | 
|  | val T | 
|  | } | 
|  |  | 
|  | func (s Some[T]) Value() T { | 
|  | return s.val | 
|  | } | 
|  |  | 
|  | func (s Some[T]) sealedOption() {} | 
|  |  | 
|  | type None struct{} | 
|  |  | 
|  | func (s None) sealedOption() {} | 
|  |  | 
|  | func main() { | 
|  | s := returnOption[int](1) | 
|  | _ = s.(Some[int]) | 
|  |  | 
|  | s = returnOption[int](0) | 
|  | _ = s.(None) | 
|  |  | 
|  | switch (any)(s).(type) { | 
|  | case Some[int]: | 
|  | panic("s is a Some[int]") | 
|  | case None: | 
|  | // ok | 
|  | default: | 
|  | panic("oops") | 
|  | } | 
|  | } |