| // run | |
| // 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") | |
| } | |
| } |