exec garble build exec ./main cmp stdout main.stdout ! binsubstr main$exe 'unexportedMethod' 'privateIface' [short] stop # no need to verify this with -short # Check that the program works as expected without garble. go build exec ./main cmp stdout main.stdout -- go.mod -- module test/main go 1.22 -- main.go -- package main import ( "fmt" "test/main/lib1" "test/main/lib2" "test/main/lib3" ) type T string func (t T) String() string { return "String method for " + string(t) } func (t T) unexportedMethod() string { return "unexported method for " + string(t) } type privateInterface interface { privateIface() } func (T) privateIface() {} var _ privateInterface = T("") type StructUnnamed = struct { Foo int Bar struct { Nested *[]string } Named lib3.Named lib3.StructEmbed Tagged string // no field tag } var _ = lib1.Struct1(lib2.Struct2{}) var _ = StructUnnamed(lib2.Struct2{}) func main() { fmt.Println(T("foo")) fmt.Println(T("foo").unexportedMethod()) } -- lib1/lib1.go -- package lib1 import "test/main/lib3" type Struct1 struct { Foo int Bar struct { Nested *[]string } Named lib3.Named lib3.StructEmbed Tagged string `json:"tagged1"` } -- lib2/lib2.go -- package lib2 import "test/main/lib3" type Struct2 struct { Foo int Bar struct { Nested *[]string } Named lib3.Named lib3.StructEmbed Tagged string `json:"tagged2"` } -- lib3/lib3.go -- package lib3 type Named int type StructEmbed struct { Baz any } -- main.stdout -- String method for foo unexported method for foo