Compare commits
174 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
274eecdf18 | ||
|
|
8fa00f826c | ||
|
|
a64fe5b210 | ||
|
|
5c59dc425f | ||
|
|
8ad14d8ea4 | ||
|
|
8a1f9ef44e | ||
|
|
5cd1e11379 | ||
|
|
24b5375636 | ||
|
|
a83f492309 | ||
|
|
02c30482cc | ||
|
|
9e1da978b0 | ||
|
|
662838fd80 | ||
|
|
92d65c22f0 | ||
|
|
2db4579b6f | ||
|
|
101633c380 | ||
|
|
1e0f6ece6e | ||
|
|
662d2a6afe | ||
|
|
b25ee3f809 | ||
|
|
81e1e5f206 | ||
|
|
81d8339132 | ||
|
|
d494f9e420 | ||
|
|
6da1107c39 | ||
|
|
38a7331bf9 | ||
|
|
13783889cb | ||
|
|
ed626f3fb9 | ||
|
|
d0a34d467b | ||
|
|
83676577ac | ||
|
|
f0fc907269 | ||
|
|
61f4704925 | ||
|
|
b1ccfbf47f | ||
|
|
0ed4b362dc | ||
|
|
98807387a4 | ||
|
|
c817823ba1 | ||
|
|
3cb8bca81a | ||
|
|
a38d19288f | ||
|
|
7f8ffa6719 | ||
|
|
513f5e37aa | ||
|
|
9520a92241 | ||
|
|
d47821bfaa | ||
|
|
d7ede8ed5c | ||
|
|
22c63b225c | ||
|
|
c0eaab0891 | ||
|
|
c74d050c5a | ||
|
|
804664c631 | ||
|
|
f6d8261a8a | ||
|
|
68c02ce054 | ||
|
|
4b3e9ee231 | ||
|
|
8916618a81 | ||
|
|
57b49f40d6 | ||
|
|
190dade469 | ||
|
|
6b652ea485 | ||
|
|
473bc63588 | ||
|
|
e32da38ad0 | ||
|
|
b2b519c2fd | ||
|
|
9491e58920 | ||
|
|
f362237ac5 | ||
|
|
a83ec1f925 | ||
|
|
155ca4e6ad | ||
|
|
ca196a5768 | ||
|
|
b78d55c66b | ||
|
|
16f5586a11 | ||
|
|
c3cf301c60 | ||
|
|
0dde990d0b | ||
|
|
4cfeb1946e | ||
|
|
ec64b006cf | ||
|
|
f36d4e01eb | ||
|
|
5dfc3b86dc | ||
|
|
3ae01a2af3 | ||
|
|
c06f83f34a | ||
|
|
a6d9c84a30 | ||
|
|
6346d11286 | ||
|
|
1edb6a1424 | ||
|
|
a2f56431ea | ||
|
|
42abedb25d | ||
|
|
151699ef9f | ||
|
|
f1f3ca7e06 | ||
|
|
9ddecfa121 | ||
|
|
04770a4b81 | ||
|
|
341c69d922 | ||
|
|
f4cc059e3e | ||
|
|
535e7e1c42 | ||
|
|
cb0f3a77bb | ||
|
|
b1279d0a21 | ||
|
|
f3f9ffaea7 | ||
|
|
e332a6b3be | ||
|
|
358a57b4b9 | ||
|
|
3640f2f820 | ||
|
|
3faa47c61e | ||
|
|
896bfeb5a1 | ||
|
|
1029d102e5 | ||
|
|
065d4fa4d7 | ||
|
|
332becf95d | ||
|
|
da9e6a0d6c | ||
|
|
913680d1ed | ||
|
|
a004809fc2 | ||
|
|
b0cd93a936 | ||
|
|
611a8c37fa | ||
|
|
e71ddc7edd | ||
|
|
1fe75f149d | ||
|
|
cdc352cee2 | ||
|
|
88569f5df7 | ||
|
|
2ac0c6f70b | ||
|
|
bd4ce37baa | ||
|
|
9c4d3d1e5a | ||
|
|
25c681c1e6 | ||
|
|
9c51f6bb69 | ||
|
|
589b2a0cd2 | ||
|
|
68911f8b4e | ||
|
|
e5a7b0de11 | ||
|
|
563270ca02 | ||
|
|
5eecbe515b | ||
|
|
0a79069dfc | ||
|
|
0c8f538cd9 | ||
|
|
ca80ada849 | ||
|
|
3c6df504df | ||
|
|
98eacf3610 | ||
|
|
16ff52a949 | ||
|
|
640d1429e5 | ||
|
|
659913eebe | ||
|
|
b3766509cc | ||
|
|
bc2b224bae | ||
|
|
9d4685deea | ||
|
|
2a70a71dc2 | ||
|
|
851444453c | ||
|
|
a8b1c2a017 | ||
|
|
d229c2a2c7 | ||
|
|
2f2df7a0f8 | ||
|
|
4058fd8c44 | ||
|
|
097a745e72 | ||
|
|
1f514e63a8 | ||
|
|
a15ecb7176 | ||
|
|
d4aa84f729 | ||
|
|
9977ef6fc6 | ||
|
|
39430c34bb | ||
|
|
4f3481b55c | ||
|
|
55f2fe396a | ||
|
|
108b6fd722 | ||
|
|
a3b2737b5c | ||
|
|
d2c4a36c25 | ||
|
|
f5f44f7ddd | ||
|
|
4d013e4686 | ||
|
|
c11d361953 | ||
|
|
c2ad279643 | ||
|
|
9627782394 | ||
|
|
e00b853971 | ||
|
|
7cfa264dbc | ||
|
|
a6c24a0d13 | ||
|
|
f19b7563ea | ||
|
|
0643762852 | ||
|
|
7323d97023 | ||
|
|
6486909921 | ||
|
|
d252821df3 | ||
|
|
2bef03e253 | ||
|
|
1fe91be882 | ||
|
|
5cbbf9339c | ||
|
|
8365f687e7 | ||
|
|
36836cd4f2 | ||
|
|
82b499a1c8 | ||
|
|
0ef7f8fb80 | ||
|
|
c1f5005b2a | ||
|
|
def57d57c2 | ||
|
|
74479d70e6 | ||
|
|
f1cff308e6 | ||
|
|
6f878052f8 | ||
|
|
eb25c84797 | ||
|
|
2de0c80d38 | ||
|
|
151a856bf2 | ||
|
|
d5217f7db4 | ||
|
|
01e4cdea70 | ||
|
|
3c88542180 | ||
|
|
56d88ef89d | ||
|
|
5d78c8ae27 | ||
|
|
184623d81f | ||
|
|
5d56bac8d0 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -3,7 +3,7 @@
|
|||||||
*.dot
|
*.dot
|
||||||
.idea/
|
.idea/
|
||||||
/yaegi
|
/yaegi
|
||||||
cmd/goexports/goexports
|
internal/cmd/extract/extract
|
||||||
example/inception/inception
|
example/inception/inception
|
||||||
_test/tmp/
|
_test/tmp/
|
||||||
/dist
|
/dist
|
||||||
|
|||||||
@@ -38,6 +38,11 @@
|
|||||||
"gocognit",
|
"gocognit",
|
||||||
"stylecheck",
|
"stylecheck",
|
||||||
"gomnd",
|
"gomnd",
|
||||||
|
"testpackage",
|
||||||
|
"goerr113",
|
||||||
|
"nestif",
|
||||||
|
"exhaustive",
|
||||||
|
"nlreturn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[issues]
|
[issues]
|
||||||
|
|||||||
@@ -3,32 +3,7 @@ project_name: yaegi
|
|||||||
builds:
|
builds:
|
||||||
- id: yaegi
|
- id: yaegi
|
||||||
binary: yaegi
|
binary: yaegi
|
||||||
main: ./cmd/yaegi/yaegi.go
|
main: ./cmd/yaegi/
|
||||||
|
|
||||||
goos:
|
|
||||||
- darwin
|
|
||||||
- linux
|
|
||||||
# - windows
|
|
||||||
- freebsd
|
|
||||||
- openbsd
|
|
||||||
- solaris
|
|
||||||
goarch:
|
|
||||||
- amd64
|
|
||||||
- 386
|
|
||||||
- arm
|
|
||||||
- arm64
|
|
||||||
goarm:
|
|
||||||
- 7
|
|
||||||
- 6
|
|
||||||
- 5
|
|
||||||
|
|
||||||
ignore:
|
|
||||||
- goos: darwin
|
|
||||||
goarch: 386
|
|
||||||
|
|
||||||
- id: goexports
|
|
||||||
binary: goexports
|
|
||||||
main: ./cmd/goexports/goexports.go
|
|
||||||
|
|
||||||
goos:
|
goos:
|
||||||
- darwin
|
- darwin
|
||||||
@@ -70,3 +45,19 @@ archives:
|
|||||||
format: zip
|
format: zip
|
||||||
files:
|
files:
|
||||||
- LICENSE
|
- LICENSE
|
||||||
|
|
||||||
|
brews:
|
||||||
|
- tap:
|
||||||
|
owner: traefik
|
||||||
|
name: homebrew-tap
|
||||||
|
commit_author:
|
||||||
|
name: traefiker
|
||||||
|
email: 30906710+traefiker@users.noreply.github.com
|
||||||
|
folder: Formula
|
||||||
|
homepage: https://github.com/traefik/yaegi
|
||||||
|
description: |
|
||||||
|
Yaegi is Another Elegant Go Interpreter.
|
||||||
|
It powers executable Go scripts and plugins, in embedded interpreters
|
||||||
|
or interactive shells, on top of the Go runtime.
|
||||||
|
test: |
|
||||||
|
system "#{bin}/yaegi version"
|
||||||
|
|||||||
@@ -19,15 +19,15 @@ cache:
|
|||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
include:
|
include:
|
||||||
- go: 1.13.x
|
|
||||||
- go: 1.14.x
|
- go: 1.14.x
|
||||||
|
- go: 1.15.x
|
||||||
env: STABLE=true
|
env: STABLE=true
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- GO111MODULE=on
|
- GO111MODULE=on
|
||||||
|
|
||||||
go_import_path: github.com/containous/yaegi
|
go_import_path: github.com/traefik/yaegi
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
# Install linters and misspell
|
# Install linters and misspell
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
Yaegi is an open source project, and your feedback and contributions
|
Yaegi is an open source project, and your feedback and contributions
|
||||||
are needed and always welcome.
|
are needed and always welcome.
|
||||||
|
|
||||||
[Issues] and [Pull Requests] are opened at https://github.com/containous/yaegi.
|
[Issues] and [Pull Requests] are opened at https://github.com/traefik/yaegi.
|
||||||
|
|
||||||
Non trivial changes should be discussed with the project maintainers by
|
Non trivial changes should be discussed with the project maintainers by
|
||||||
opening a [Feature Request] clearly explaining rationale, background
|
opening a [Feature Request] clearly explaining rationale, background
|
||||||
@@ -13,12 +13,12 @@ discussions.
|
|||||||
Once the proposal is approved, a Pull Request can be opened. If you want
|
Once the proposal is approved, a Pull Request can be opened. If you want
|
||||||
to provide early visibility to reviewers, create a [Draft Pull Request].
|
to provide early visibility to reviewers, create a [Draft Pull Request].
|
||||||
|
|
||||||
We will also require you to sign the [Containous Contributor License Agreement]
|
We will also require you to sign the [Traefik Contributor License Agreement]
|
||||||
after you submit your first pull request to this project. The link to sign the
|
after you submit your first pull request to this project. The link to sign the
|
||||||
agreement will be presented to you in the web interface of the pull request.
|
agreement will be presented to you in the web interface of the pull request.
|
||||||
|
|
||||||
[Issues]: https://github.com/containous/yaegi/issues
|
[Issues]: https://github.com/traefik/yaegi/issues
|
||||||
[Pull Requests]: https://github.com/containous/yaegi/issues
|
[Pull Requests]: https://github.com/traefik/yaegi/issues
|
||||||
[Feature Request]: https://github.com/containous/yaegi/issues/new?template=feature_request.md
|
[Feature Request]: https://github.com/traefik/yaegi/issues/new?template=feature_request.md
|
||||||
[Draft Pull Request]: https://github.blog/2019-02-14-introducing-draft-pull-requests/
|
[Draft Pull Request]: https://github.blog/2019-02-14-introducing-draft-pull-requests/
|
||||||
[Containous Contributor License Agreement]: https://cla-assistant.io/containous/yaegi
|
[Traefik Labs Contributor License Agreement]: https://cla-assistant.io/traefik/yaegi
|
||||||
|
|||||||
1
LICENSE
1
LICENSE
@@ -187,6 +187,7 @@
|
|||||||
identification within third-party archives.
|
identification within third-party archives.
|
||||||
|
|
||||||
Copyright 2019 Containous SAS
|
Copyright 2019 Containous SAS
|
||||||
|
Copyright 2020 Traefik Labs SAS
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|||||||
27
Makefile
27
Makefile
@@ -3,21 +3,28 @@ check:
|
|||||||
golangci-lint run
|
golangci-lint run
|
||||||
|
|
||||||
# Generate stdlib/syscall/syscall_GOOS_GOARCH.go for all platforms
|
# Generate stdlib/syscall/syscall_GOOS_GOARCH.go for all platforms
|
||||||
gen_all_syscall: cmd/goexports/goexports
|
gen_all_syscall: internal/cmd/extract/extract
|
||||||
@cd stdlib/syscall && \
|
@for v in $$(go tool dist list); do \
|
||||||
for v in $$(go tool dist list); do \
|
|
||||||
echo syscall_$${v%/*}_$${v#*/}.go; \
|
echo syscall_$${v%/*}_$${v#*/}.go; \
|
||||||
GOOS=$${v%/*} GOARCH=$${v#*/} go generate; \
|
GOOS=$${v%/*} GOARCH=$${v#*/} go generate ./stdlib/syscall ./stdlib/unrestricted; \
|
||||||
done
|
done
|
||||||
|
|
||||||
cmd/goexports/goexports: cmd/goexports/goexports.go
|
internal/cmd/extract/extract:
|
||||||
go generate cmd/goexports/goexports.go
|
rm -f internal/cmd/extract/extract
|
||||||
|
go generate ./internal/cmd/extract
|
||||||
|
|
||||||
generate: gen_all_syscall
|
generate: gen_all_syscall
|
||||||
go generate
|
go generate
|
||||||
|
|
||||||
tests:
|
install:
|
||||||
GO111MODULE=off go test -v ./...
|
GOFLAGS=-ldflags=-X=main.version=$$(git describe --tags) go install ./...
|
||||||
GO111MODULE=off go test -race ./interp
|
|
||||||
|
|
||||||
.PHONY: check gen_all_syscall gen_tests
|
tests:
|
||||||
|
go test -v ./...
|
||||||
|
go test -race ./interp
|
||||||
|
|
||||||
|
# https://github.com/goreleaser/godownloader
|
||||||
|
install.sh: .goreleaser.yml
|
||||||
|
godownloader --repo=traefik/yaegi -o install.sh .goreleaser.yml
|
||||||
|
|
||||||
|
.PHONY: check gen_all_syscall gen_tests generate_downloader internal/cmd/extract/extract install
|
||||||
|
|||||||
58
README.md
58
README.md
@@ -2,9 +2,9 @@
|
|||||||
<img width="400" src="doc/images/yaegi.png" alt="Yaegi" title="Yaegi" />
|
<img width="400" src="doc/images/yaegi.png" alt="Yaegi" title="Yaegi" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://github.com/containous/yaegi/releases)
|
[](https://github.com/traefik/yaegi/releases)
|
||||||
[](https://travis-ci.com/containous/yaegi)
|
[](https://travis-ci.com/traefik/yaegi)
|
||||||
[](https://godoc.org/github.com/containous/yaegi)
|
[](https://godoc.org/github.com/traefik/yaegi)
|
||||||
[](https://community.containo.us/c/yaegi)
|
[](https://community.containo.us/c/yaegi)
|
||||||
|
|
||||||
Yaegi is Another Elegant Go Interpreter.
|
Yaegi is Another Elegant Go Interpreter.
|
||||||
@@ -25,18 +25,24 @@ It powers executable Go scripts and plugins, in embedded interpreters or interac
|
|||||||
### Go package
|
### Go package
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "github.com/containous/yaegi/interp"
|
import "github.com/traefik/yaegi/interp"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Command-line executable
|
### Command-line executable
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go get -u github.com/containous/yaegi/cmd/yaegi
|
go get -u github.com/traefik/yaegi/cmd/yaegi
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that you can use [rlwrap](https://github.com/hanslub42/rlwrap) (install with your favorite package manager),
|
Note that you can use [rlwrap](https://github.com/hanslub42/rlwrap) (install with your favorite package manager),
|
||||||
and alias the `yaegi` command in `alias yaegi='rlwrap yaegi'` in your `~/.bashrc`, to have history and command line edition.
|
and alias the `yaegi` command in `alias yaegi='rlwrap yaegi'` in your `~/.bashrc`, to have history and command line edition.
|
||||||
|
|
||||||
|
### CI Integration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -sfL https://raw.githubusercontent.com/traefik/yaegi/master/install.sh | bash -s -- -b $GOPATH/bin v0.9.0
|
||||||
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
### As an embedded interpreter
|
### As an embedded interpreter
|
||||||
@@ -47,8 +53,8 @@ Create an interpreter with `New()`, run Go code with `Eval()`:
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/containous/yaegi/interp"
|
"github.com/traefik/yaegi/interp"
|
||||||
"github.com/containous/yaegi/stdlib"
|
"github.com/traefik/yaegi/stdlib"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -68,7 +74,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
[Go Playground](https://play.golang.org/p/zzvw4VlerLP)
|
[Go Playground](https://play.golang.org/p/2n-EpZbMYI9)
|
||||||
|
|
||||||
### As a dynamic extension framework
|
### As a dynamic extension framework
|
||||||
|
|
||||||
@@ -81,7 +87,7 @@ The following program is compiled ahead of time, except `bar()` which is interpr
|
|||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/containous/yaegi/interp"
|
import "github.com/traefik/yaegi/interp"
|
||||||
|
|
||||||
const src = `package foo
|
const src = `package foo
|
||||||
func Bar(s string) string { return s + "-Foo" }`
|
func Bar(s string) string { return s + "-Foo" }`
|
||||||
@@ -106,7 +112,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
[Go Playground](https://play.golang.org/p/6SEAoaO7n0U)
|
[Go Playground](https://play.golang.org/p/WvwH4JqrU-p)
|
||||||
|
|
||||||
### As a command-line interpreter
|
### As a command-line interpreter
|
||||||
|
|
||||||
@@ -122,10 +128,20 @@ Hello World
|
|||||||
>
|
>
|
||||||
```
|
```
|
||||||
|
|
||||||
Or interpret Go files:
|
Note that in interactive mode, all stdlib package are pre-imported,
|
||||||
|
you can use them directly:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ yaegi cmd/yaegi/yaegi.go
|
$ yaegi
|
||||||
|
> reflect.TypeOf(time.Date)
|
||||||
|
: func(int, time.Month, int, int, int, int, int, *time.Location) time.Time
|
||||||
|
>
|
||||||
|
```
|
||||||
|
|
||||||
|
Or interpret Go packages, directories or files, including itself:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ yaegi -syscall -unsafe -unrestricted github.com/traefik/yaegi/cmd/yaegi
|
||||||
>
|
>
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -155,11 +171,11 @@ Documentation about Yaegi commands and libraries can be found at usual [godoc.or
|
|||||||
|
|
||||||
Beside the known [bugs] which are supposed to be fixed in the short term, there are some limitations not planned to be addressed soon:
|
Beside the known [bugs] which are supposed to be fixed in the short term, there are some limitations not planned to be addressed soon:
|
||||||
|
|
||||||
- assembly files (`.s`) are not supported
|
- Assembly files (`.s`) are not supported.
|
||||||
- calling C code is not supported (no virtual "C" package)
|
- Calling C code is not supported (no virtual "C" package).
|
||||||
- interfaces to be used from the pre-compiled code can not be added dynamically, as it is required to pre-compile interface wrappers
|
- Interfaces to be used from the pre-compiled code can not be added dynamically, as it is required to pre-compile interface wrappers.
|
||||||
- representation of types by `reflect` and printing values using %T may give different results between compiled mode and interpreted mode
|
- Representation of types by `reflect` and printing values using %T may give different results between compiled mode and interpreted mode.
|
||||||
- interpreting computation intensive code is likely to remain significantly slower than in compiled mode
|
- Interpreting computation intensive code is likely to remain significantly slower than in compiled mode.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
@@ -170,7 +186,7 @@ Beside the known [bugs] which are supposed to be fixed in the short term, there
|
|||||||
[Apache 2.0][License].
|
[Apache 2.0][License].
|
||||||
|
|
||||||
[specs]: https://golang.org/ref/spec
|
[specs]: https://golang.org/ref/spec
|
||||||
[docs]: https://godoc.org/github.com/containous/yaegi
|
[docs]: https://godoc.org/github.com/traefik/yaegi
|
||||||
[license]: https://github.com/containous/yaegi/blob/master/LICENSE
|
[license]: https://github.com/traefik/yaegi/blob/master/LICENSE
|
||||||
[github]: https://github.com/containous/yaegi
|
[github]: https://github.com/traefik/yaegi
|
||||||
[bugs]: https://github.com/containous/yaegi/issues?q=is%3Aissue+is%3Aopen+label%3Abug
|
[bugs]: https://github.com/traefik/yaegi/issues?q=is%3Aissue+is%3Aopen+label%3Abug
|
||||||
|
|||||||
16
_test/a42.go
Normal file
16
_test/a42.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var b [8]byte
|
||||||
|
binary.LittleEndian.PutUint64(b[:], uint64(1))
|
||||||
|
|
||||||
|
fmt.Println(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [1 0 0 0 0 0 0 0]
|
||||||
17
_test/a43.go
Normal file
17
_test/a43.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type T [l1 + l2]int
|
||||||
|
|
||||||
|
const (
|
||||||
|
l1 = 2
|
||||||
|
l2 = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(T{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [0 0 0 0 0]
|
||||||
12
_test/a44.go
Normal file
12
_test/a44.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
var a = [max]int{}
|
||||||
|
|
||||||
|
const max = 32
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println(len(a))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 32
|
||||||
25
_test/addr0.go
Normal file
25
_test/addr0.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type extendedRequest struct {
|
||||||
|
http.Request
|
||||||
|
|
||||||
|
Data string
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := extendedRequest{}
|
||||||
|
req := &r.Request
|
||||||
|
|
||||||
|
|
||||||
|
fmt.Println(r)
|
||||||
|
fmt.Println(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// {{ <nil> 0 0 map[] <nil> <nil> 0 [] false map[] map[] <nil> map[] <nil> <nil> <nil> <nil>} }
|
||||||
|
// &{ <nil> 0 0 map[] <nil> <nil> 0 [] false map[] map[] <nil> map[] <nil> <nil> <nil> <nil>}
|
||||||
22
_test/addr1.go
Normal file
22
_test/addr1.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
A int
|
||||||
|
B int
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := &[]T{
|
||||||
|
{1, 2},
|
||||||
|
{3, 4},
|
||||||
|
}
|
||||||
|
fmt.Println("a:", a)
|
||||||
|
x := &(*a)[1:][0]
|
||||||
|
fmt.Println("x:", x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// a: &[{1 2} {3 4}]
|
||||||
|
// x: &{3 4}
|
||||||
29
_test/addr2.go
Normal file
29
_test/addr2.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Email struct {
|
||||||
|
Where string `xml:"where,attr"`
|
||||||
|
Addr string
|
||||||
|
}
|
||||||
|
|
||||||
|
func f(s string, r interface{}) error {
|
||||||
|
return xml.Unmarshal([]byte(s), &r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := `
|
||||||
|
<Email where='work'>
|
||||||
|
<Addr>bob@work.com</Addr>
|
||||||
|
</Email>
|
||||||
|
`
|
||||||
|
v := Email{}
|
||||||
|
err := f(data, &v)
|
||||||
|
fmt.Println(err, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ouput:
|
||||||
|
// <nil> {work bob@work.com}
|
||||||
15
_test/append1.go
Normal file
15
_test/append1.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := bufio.NewScanner(bytes.NewReader([]byte("Hello\nTest\nLine3")))
|
||||||
|
s.Scan()
|
||||||
|
println(string(append(s.Bytes(), []byte(" World")...)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Hello World
|
||||||
15
_test/append2.go
Normal file
15
_test/append2.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := bufio.NewScanner(bytes.NewReader([]byte("Hello\nTest\nLine3")))
|
||||||
|
s.Scan()
|
||||||
|
println(string(append(s.Bytes(), " World"...)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Hello World
|
||||||
125
_test/assert0.go
Normal file
125
_test/assert0.go
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MyWriter interface {
|
||||||
|
Write(p []byte) (i int, err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestStruct struct{}
|
||||||
|
|
||||||
|
func (t TestStruct) Write(p []byte) (n int, err error) {
|
||||||
|
return len(p), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func usesWriter(w MyWriter) {
|
||||||
|
n, _ := w.Write([]byte("hello world"))
|
||||||
|
fmt.Println(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
type MyStringer interface {
|
||||||
|
String() string
|
||||||
|
}
|
||||||
|
|
||||||
|
func usesStringer(s MyStringer) {
|
||||||
|
fmt.Println(s.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
aType := reflect.TypeOf((*MyWriter)(nil)).Elem()
|
||||||
|
|
||||||
|
var t interface{}
|
||||||
|
t = TestStruct{}
|
||||||
|
var tw MyWriter
|
||||||
|
var ok bool
|
||||||
|
tw, ok = t.(MyWriter)
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("TestStruct does not implement MyWriter")
|
||||||
|
} else {
|
||||||
|
fmt.Println("TestStruct implements MyWriter")
|
||||||
|
usesWriter(tw)
|
||||||
|
}
|
||||||
|
n, _ := t.(MyWriter).Write([]byte("hello world"))
|
||||||
|
fmt.Println(n)
|
||||||
|
bType := reflect.TypeOf(TestStruct{})
|
||||||
|
fmt.Println(bType.Implements(aType))
|
||||||
|
|
||||||
|
// not redundant with the above, because it goes through a slightly different code path.
|
||||||
|
if _, ok := t.(MyWriter); !ok {
|
||||||
|
fmt.Println("TestStruct does not implement MyWriter")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
fmt.Println("TestStruct implements MyWriter")
|
||||||
|
}
|
||||||
|
|
||||||
|
t = 42
|
||||||
|
foo, ok := t.(MyWriter)
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("42 does not implement MyWriter")
|
||||||
|
} else {
|
||||||
|
fmt.Println("42 implements MyWriter")
|
||||||
|
}
|
||||||
|
_ = foo
|
||||||
|
|
||||||
|
if _, ok := t.(MyWriter); !ok {
|
||||||
|
fmt.Println("42 does not implement MyWriter")
|
||||||
|
} else {
|
||||||
|
fmt.Println("42 implements MyWriter")
|
||||||
|
}
|
||||||
|
|
||||||
|
var tt interface{}
|
||||||
|
tt = time.Nanosecond
|
||||||
|
var myD MyStringer
|
||||||
|
myD, ok = tt.(MyStringer)
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("time.Nanosecond does not implement MyStringer")
|
||||||
|
} else {
|
||||||
|
fmt.Println("time.Nanosecond implements MyStringer")
|
||||||
|
usesStringer(myD)
|
||||||
|
}
|
||||||
|
fmt.Println(tt.(MyStringer).String())
|
||||||
|
cType := reflect.TypeOf((*MyStringer)(nil)).Elem()
|
||||||
|
dType := reflect.TypeOf(time.Nanosecond)
|
||||||
|
fmt.Println(dType.Implements(cType))
|
||||||
|
|
||||||
|
if _, ok := tt.(MyStringer); !ok {
|
||||||
|
fmt.Println("time.Nanosecond does not implement MyStringer")
|
||||||
|
} else {
|
||||||
|
fmt.Println("time.Nanosecond implements MyStringer")
|
||||||
|
}
|
||||||
|
|
||||||
|
tt = 42
|
||||||
|
bar, ok := tt.(MyStringer)
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("42 does not implement MyStringer")
|
||||||
|
} else {
|
||||||
|
fmt.Println("42 implements MyStringer")
|
||||||
|
}
|
||||||
|
_ = bar
|
||||||
|
|
||||||
|
if _, ok := tt.(MyStringer); !ok {
|
||||||
|
fmt.Println("42 does not implement MyStringer")
|
||||||
|
} else {
|
||||||
|
fmt.Println("42 implements MyStringer")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// TestStruct implements MyWriter
|
||||||
|
// 11
|
||||||
|
// 11
|
||||||
|
// true
|
||||||
|
// TestStruct implements MyWriter
|
||||||
|
// 42 does not implement MyWriter
|
||||||
|
// 42 does not implement MyWriter
|
||||||
|
// time.Nanosecond implements MyStringer
|
||||||
|
// 1ns
|
||||||
|
// 1ns
|
||||||
|
// true
|
||||||
|
// time.Nanosecond implements MyStringer
|
||||||
|
// 42 does not implement MyStringer
|
||||||
|
// 42 does not implement MyStringer
|
||||||
85
_test/assert1.go
Normal file
85
_test/assert1.go
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestStruct struct{}
|
||||||
|
|
||||||
|
func (t TestStruct) String() string {
|
||||||
|
return "hello world"
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
aType := reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
|
||||||
|
|
||||||
|
var t interface{}
|
||||||
|
t = time.Nanosecond
|
||||||
|
s, ok := t.(fmt.Stringer)
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("time.Nanosecond does not implement fmt.Stringer")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(s.String())
|
||||||
|
fmt.Println(t.(fmt.Stringer).String())
|
||||||
|
bType := reflect.TypeOf(time.Nanosecond)
|
||||||
|
fmt.Println(bType.Implements(aType))
|
||||||
|
|
||||||
|
// not redundant with the above, because it goes through a slightly different code path.
|
||||||
|
if _, ok := t.(fmt.Stringer); !ok {
|
||||||
|
fmt.Println("time.Nanosecond does not implement fmt.Stringer")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
fmt.Println("time.Nanosecond implements fmt.Stringer")
|
||||||
|
}
|
||||||
|
|
||||||
|
t = 42
|
||||||
|
foo, ok := t.(fmt.Stringer)
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("42 does not implement fmt.Stringer")
|
||||||
|
} else {
|
||||||
|
fmt.Println("42 implements fmt.Stringer")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_ = foo
|
||||||
|
|
||||||
|
if _, ok := t.(fmt.Stringer); !ok {
|
||||||
|
fmt.Println("42 does not implement fmt.Stringer")
|
||||||
|
} else {
|
||||||
|
fmt.Println("42 implements fmt.Stringer")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var tt interface{}
|
||||||
|
tt = TestStruct{}
|
||||||
|
ss, ok := tt.(fmt.Stringer)
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("TestStuct does not implement fmt.Stringer")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(ss.String())
|
||||||
|
fmt.Println(tt.(fmt.Stringer).String())
|
||||||
|
// TODO(mpl): uncomment when fixed
|
||||||
|
// cType := reflect.TypeOf(TestStruct{})
|
||||||
|
// fmt.Println(cType.Implements(aType))
|
||||||
|
|
||||||
|
if _, ok := tt.(fmt.Stringer); !ok {
|
||||||
|
fmt.Println("TestStuct does not implement fmt.Stringer")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
fmt.Println("TestStuct implements fmt.Stringer")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 1ns
|
||||||
|
// 1ns
|
||||||
|
// true
|
||||||
|
// time.Nanosecond implements fmt.Stringer
|
||||||
|
// 42 does not implement fmt.Stringer
|
||||||
|
// 42 does not implement fmt.Stringer
|
||||||
|
// hello world
|
||||||
|
// hello world
|
||||||
|
// TestStuct implements fmt.Stringer
|
||||||
19
_test/assign13.go
Normal file
19
_test/assign13.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func getStr() string {
|
||||||
|
return "test"
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m := make(map[string]string, 0)
|
||||||
|
m["a"] = fmt.Sprintf("%v", 0.1)
|
||||||
|
m["b"] = string(fmt.Sprintf("%v", 0.1))
|
||||||
|
m["c"] = getStr()
|
||||||
|
|
||||||
|
fmt.Println(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// map[a:0.1 b:0.1 c:test]
|
||||||
16
_test/assign14.go
Normal file
16
_test/assign14.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
var optionsG map[string]string = nil
|
||||||
|
|
||||||
|
var roundG = 30
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
dummy := roundG
|
||||||
|
roundG = dummy + 1
|
||||||
|
println(roundG)
|
||||||
|
println(optionsG == nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 31
|
||||||
|
// true
|
||||||
11
_test/assign15.go
Normal file
11
_test/assign15.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var c chan<- struct{} = make(chan struct{})
|
||||||
|
var d <-chan struct{} = c
|
||||||
|
|
||||||
|
_ = d
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error:
|
||||||
|
// _test/assign15.go:5:26: cannot use type chan<- struct{} as type <-chan struct{} in assignment
|
||||||
15
_test/assign16.go
Normal file
15
_test/assign16.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type H struct {
|
||||||
|
bits uint
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
h := &H{8}
|
||||||
|
var x uint = (1 << h.bits) >> 6
|
||||||
|
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 4
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package foo
|
package foo
|
||||||
|
|
||||||
import bar "github.com/containous/yaegi/_test/b2/foo"
|
import bar "github.com/traefik/yaegi/_test/b2/foo"
|
||||||
|
|
||||||
var Desc = "in b1/foo"
|
var Desc = "in b1/foo"
|
||||||
|
|
||||||
|
|||||||
3
_test/baz-bat/baz-bat.go
Normal file
3
_test/baz-bat/baz-bat.go
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
package baz
|
||||||
|
|
||||||
|
var Name = "baz-bat"
|
||||||
17
_test/binstruct_ptr_map0.go
Normal file
17
_test/binstruct_ptr_map0.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"image"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v := map[string]*image.Point{
|
||||||
|
"foo": {X: 3, Y: 2},
|
||||||
|
"bar": {X: 4, Y: 5},
|
||||||
|
}
|
||||||
|
fmt.Println(v["foo"], v["bar"])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// (3,2) (4,5)
|
||||||
17
_test/binstruct_ptr_slice0.go
Normal file
17
_test/binstruct_ptr_slice0.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"image"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v := []*image.Point{
|
||||||
|
{X: 3, Y: 2},
|
||||||
|
{X: 4, Y: 5},
|
||||||
|
}
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [(3,2) (4,5)]
|
||||||
16
_test/binstruct_slice0.go
Normal file
16
_test/binstruct_slice0.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"image"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v := []image.Point{
|
||||||
|
{X: 3, Y: 2},
|
||||||
|
}
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [(3,2)]
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
package c1
|
package c1
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/c2"
|
import "github.com/traefik/yaegi/_test/c2"
|
||||||
|
|
||||||
var C1 = c2.C2 + "x"
|
var C1 = c2.C2 + "x"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package c2
|
package c2
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/c1"
|
import "github.com/traefik/yaegi/_test/c1"
|
||||||
|
|
||||||
var C2 = c1.C1 + "Y"
|
var C2 = c1.C1 + "Y"
|
||||||
|
|||||||
12
_test/chan10.go
Normal file
12
_test/chan10.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var tick <-chan time.Time = time.Tick(time.Millisecond)
|
||||||
|
_ = tick
|
||||||
|
println("success")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// success
|
||||||
51
_test/cli4.go
Normal file
51
_test/cli4.go
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mw1 struct {
|
||||||
|
next http.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mw1) ServeHTTP(rw http.ResponseWriter, rq *http.Request) {
|
||||||
|
m.next.ServeHTTP(rw, rq)
|
||||||
|
}
|
||||||
|
|
||||||
|
type mw0 struct{}
|
||||||
|
|
||||||
|
func (m *mw0) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprint(w, "Welcome to my website!")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m0 := &mw0{}
|
||||||
|
m1 := &mw1{m0}
|
||||||
|
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/", m1.ServeHTTP)
|
||||||
|
|
||||||
|
server := httptest.NewServer(mux)
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
client(server.URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
func client(uri string) {
|
||||||
|
resp, err := http.Get(uri)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(body))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Welcome to my website!
|
||||||
51
_test/cli5.go
Normal file
51
_test/cli5.go
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mw1 struct {
|
||||||
|
next http.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mw1) ServeHTTP(rw http.ResponseWriter, rq *http.Request) {
|
||||||
|
m.next.ServeHTTP(rw, rq)
|
||||||
|
}
|
||||||
|
|
||||||
|
type mw0 struct{}
|
||||||
|
|
||||||
|
func (m *mw0) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprint(w, "Welcome to my website!")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m0 := &mw0{}
|
||||||
|
m1 := &mw1{next: m0}
|
||||||
|
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/", m1.ServeHTTP)
|
||||||
|
|
||||||
|
server := httptest.NewServer(mux)
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
client(server.URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
func client(uri string) {
|
||||||
|
resp, err := http.Get(uri)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(body))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Welcome to my website!
|
||||||
52
_test/cli6.go
Normal file
52
_test/cli6.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
)
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
http.ResponseWriter
|
||||||
|
}
|
||||||
|
|
||||||
|
type mw1 struct {
|
||||||
|
next http.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mw1) ServeHTTP(rw http.ResponseWriter, rq *http.Request) {
|
||||||
|
t := &T{
|
||||||
|
ResponseWriter: rw,
|
||||||
|
}
|
||||||
|
x := t.Header()
|
||||||
|
fmt.Fprint(rw, "Welcome to my website!", x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m1 := &mw1{}
|
||||||
|
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/", m1.ServeHTTP)
|
||||||
|
|
||||||
|
server := httptest.NewServer(mux)
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
client(server.URL)
|
||||||
|
}
|
||||||
|
|
||||||
|
func client(uri string) {
|
||||||
|
resp, err := http.Get(uri)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(body))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Welcome to my website!map[]
|
||||||
14
_test/comp2.go
Normal file
14
_test/comp2.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type delta int32
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := delta(-1)
|
||||||
|
|
||||||
|
println(a != -1)
|
||||||
|
println(a == -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// false
|
||||||
|
// true
|
||||||
14
_test/composite10.go
Normal file
14
_test/composite10.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := []map[int]int{make(map[int]int)}
|
||||||
|
|
||||||
|
for _, b := range a {
|
||||||
|
fmt.Println(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// map[]
|
||||||
15
_test/composite11.go
Normal file
15
_test/composite11.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"image/color"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
c := color.NRGBA64{1, 1, 1, 1}
|
||||||
|
|
||||||
|
fmt.Println(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// {1 1 1 1}
|
||||||
19
_test/composite12.go
Normal file
19
_test/composite12.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type A struct {
|
||||||
|
C D
|
||||||
|
}
|
||||||
|
|
||||||
|
type D struct {
|
||||||
|
E string
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := A{}
|
||||||
|
a.C = D{"bb"}
|
||||||
|
|
||||||
|
println(a.C.E)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// bb
|
||||||
19
_test/composite13.go
Normal file
19
_test/composite13.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type A struct {
|
||||||
|
C D
|
||||||
|
}
|
||||||
|
|
||||||
|
type D struct {
|
||||||
|
E string
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := A{}
|
||||||
|
a.C = D{E: "bb"}
|
||||||
|
|
||||||
|
println(a.C.E)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// bb
|
||||||
15
_test/composite14.go
Normal file
15
_test/composite14.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
b []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
t := T{nil}
|
||||||
|
fmt.Println(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// {[]}
|
||||||
50
_test/composite15.go
Normal file
50
_test/composite15.go
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func interfaceAsInts() {
|
||||||
|
var a interface{}
|
||||||
|
b := 2
|
||||||
|
c := 3
|
||||||
|
a = []int{b, c}
|
||||||
|
|
||||||
|
d, ok := a.([]int)
|
||||||
|
if !ok {
|
||||||
|
println("nope")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range d {
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func interfaceAsInterfaces() {
|
||||||
|
var a, b, c interface{}
|
||||||
|
b = 2
|
||||||
|
c = 3
|
||||||
|
a = []interface{}{b, c}
|
||||||
|
|
||||||
|
d, ok := a.([]interface{})
|
||||||
|
if !ok {
|
||||||
|
println("nope")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range d {
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
interfaceAsInts()
|
||||||
|
interfaceAsInterfaces()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
16
_test/composite16.go
Normal file
16
_test/composite16.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
body := url.Values{
|
||||||
|
"Action": {"none"},
|
||||||
|
}
|
||||||
|
fmt.Println(body)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// map[Action:[none]]
|
||||||
@@ -3,7 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/containous/yaegi/_test/ct1"
|
"github.com/traefik/yaegi/_test/ct1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type T struct {
|
type T struct {
|
||||||
|
|||||||
16
_test/composite8bis.go
Normal file
16
_test/composite8bis.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type T struct{ I int }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
t := []*T{}
|
||||||
|
s := []int{1, 2}
|
||||||
|
for _, e := range s {
|
||||||
|
x := &T{I: e}
|
||||||
|
t = append(t, x)
|
||||||
|
}
|
||||||
|
println(t[0].I, t[1].I)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 1 2
|
||||||
14
_test/composite9.go
Normal file
14
_test/composite9.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := [][]int{make([]int,0)}
|
||||||
|
|
||||||
|
for _, b := range a {
|
||||||
|
fmt.Println(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// []
|
||||||
16
_test/const13.go
Normal file
16
_test/const13.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
const tooBig = 1267650600228229401496703205376
|
||||||
|
const huge = 1 << 100
|
||||||
|
const large = huge >> 38
|
||||||
|
|
||||||
|
fmt.Println(large)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 4611686018427387904
|
||||||
13
_test/const14.go
Normal file
13
_test/const14.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "compress/flate"
|
||||||
|
|
||||||
|
func f1(i int) { println("i:", i) }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
i := flate.BestSpeed
|
||||||
|
f1(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// i: 1
|
||||||
17
_test/const15.go
Normal file
17
_test/const15.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type T1 t1
|
||||||
|
|
||||||
|
type t1 int8
|
||||||
|
|
||||||
|
const (
|
||||||
|
P2 T1 = 2
|
||||||
|
P3 T1 = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println(P3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 3
|
||||||
12
_test/const16.go
Normal file
12
_test/const16.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(7 / 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2
|
||||||
14
_test/const17.go
Normal file
14
_test/const17.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
var t [7/3]int
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
t[0] = 3/2
|
||||||
|
t[1] = 5/2
|
||||||
|
fmt.Println(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [1 2]
|
||||||
11
_test/const18.go
Normal file
11
_test/const18.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := int64(time.Second)
|
||||||
|
println(a)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 1000000000
|
||||||
17
_test/const19.go
Normal file
17
_test/const19.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func get10Hours() time.Duration {
|
||||||
|
return 10 * time.Hour
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(get10Hours().String())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 10h0m0s
|
||||||
12
_test/const20.go
Normal file
12
_test/const20.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
const maxLen = int64(int(^uint(0) >> 1))
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(maxLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 9223372036854775807
|
||||||
12
_test/const21.go
Normal file
12
_test/const21.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
const a = 64
|
||||||
|
|
||||||
|
var b uint = a * a / 2
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2048
|
||||||
15
_test/const22.go
Normal file
15
_test/const22.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
const (
|
||||||
|
numDec uint8 = (1 << iota) / 2
|
||||||
|
numHex
|
||||||
|
numOct
|
||||||
|
numFloat
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println(13 & (numHex | numOct))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 1
|
||||||
21
_test/convert0.go
Normal file
21
_test/convert0.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
v int
|
||||||
|
}
|
||||||
|
|
||||||
|
type comparator func(T, T) bool
|
||||||
|
|
||||||
|
func sort(items []T, comp comparator) {
|
||||||
|
println("in sort")
|
||||||
|
}
|
||||||
|
|
||||||
|
func compT(t0, t1 T) bool { return t0.v < t1.v }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := []T{}
|
||||||
|
sort(a, comparator(compT))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// in sort
|
||||||
17
_test/convert1.go
Normal file
17
_test/convert1.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "strconv"
|
||||||
|
|
||||||
|
type atoidef func(s string) (int, error)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
stdatoi := atoidef(strconv.Atoi)
|
||||||
|
n, err := stdatoi("7")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
println(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 7
|
||||||
19
_test/convert2.go
Normal file
19
_test/convert2.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "bufio"
|
||||||
|
|
||||||
|
func fakeSplitFunc(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||||
|
return 7, nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
splitfunc := bufio.SplitFunc(fakeSplitFunc)
|
||||||
|
n, _, err := splitfunc(nil, true)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
println(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 7
|
||||||
32
_test/defer5.go
Normal file
32
_test/defer5.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func f1() {
|
||||||
|
defer println("f1-begin")
|
||||||
|
f2()
|
||||||
|
defer println("f1-end")
|
||||||
|
}
|
||||||
|
|
||||||
|
func f2() {
|
||||||
|
defer println("f2-begin")
|
||||||
|
f3()
|
||||||
|
defer println("f2-end")
|
||||||
|
}
|
||||||
|
|
||||||
|
func f3() {
|
||||||
|
defer println("f3-begin")
|
||||||
|
println("hello")
|
||||||
|
defer println("f3-end")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
f1()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// hello
|
||||||
|
// f3-end
|
||||||
|
// f3-begin
|
||||||
|
// f2-end
|
||||||
|
// f2-begin
|
||||||
|
// f1-end
|
||||||
|
// f1-begin
|
||||||
27
_test/defer6.go
Normal file
27
_test/defer6.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func f1() {
|
||||||
|
defer print("f1-begin ")
|
||||||
|
f2()
|
||||||
|
defer print("f1-end ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func f2() {
|
||||||
|
defer print("f2-begin ")
|
||||||
|
f3()
|
||||||
|
defer print("f2-end ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func f3() {
|
||||||
|
defer print("f3-begin ")
|
||||||
|
print("hello ")
|
||||||
|
defer print("f3-end ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
f1()
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// hello f3-end f3-begin f2-end f2-begin f1-end f1-begin
|
||||||
18
_test/defer7.go
Normal file
18
_test/defer7.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func f1(in, out []string) {
|
||||||
|
defer copy(out, in)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
in := []string{"foo", "bar"}
|
||||||
|
out := make([]string, 2)
|
||||||
|
f1(in, out)
|
||||||
|
|
||||||
|
fmt.Println(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [foo bar]
|
||||||
24
_test/defer8.go
Normal file
24
_test/defer8.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func f1(m map[string]string) {
|
||||||
|
defer delete(m, "foo")
|
||||||
|
defer delete(m, "test")
|
||||||
|
|
||||||
|
fmt.Println(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
"baz": "bat",
|
||||||
|
}
|
||||||
|
f1(m)
|
||||||
|
|
||||||
|
fmt.Println(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// map[baz:bat foo:bar]
|
||||||
|
// map[baz:bat]
|
||||||
21
_test/defer9.go
Normal file
21
_test/defer9.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func f1(ch chan string) {
|
||||||
|
defer close(ch)
|
||||||
|
|
||||||
|
ch <- "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ch := make(chan string, 1)
|
||||||
|
f1(ch)
|
||||||
|
|
||||||
|
for s := range ch {
|
||||||
|
fmt.Println(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
@@ -2,13 +2,14 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/containous/yaegi/interp"
|
"github.com/traefik/yaegi/interp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.SetFlags(log.Lshortfile)
|
log.SetFlags(log.Lshortfile)
|
||||||
i := interp.New(interp.Options{})
|
i := interp.New(interp.Options{Stdout: os.Stdout})
|
||||||
if _, err := i.Eval(`func f() (int, int) { return 1, 2 }`); err != nil {
|
if _, err := i.Eval(`func f() (int, int) { return 1, 2 }`); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package foo
|
package foo
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/foo/boo"
|
import "github.com/traefik/yaegi/_test/foo/boo"
|
||||||
|
|
||||||
var Bar = "BARR"
|
var Bar = "BARR"
|
||||||
var Boo = boo.Boo
|
var Boo = boo.Boo
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package foo
|
package foo
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/foo/boo"
|
import "github.com/traefik/yaegi/_test/foo/boo"
|
||||||
|
|
||||||
var Bir = boo.Boo + "22"
|
var Bir = boo.Boo + "22"
|
||||||
|
|||||||
16
_test/for15.go
Normal file
16
_test/for15.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func f() int { println("in f"); return 1 }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
for i := f(); ; {
|
||||||
|
println("in loop")
|
||||||
|
if i > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// in f
|
||||||
|
// in loop
|
||||||
16
_test/for16.go
Normal file
16
_test/for16.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
max := 1
|
||||||
|
for ; ; max-- {
|
||||||
|
if max == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
println("in for")
|
||||||
|
}
|
||||||
|
println("bye")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// in for
|
||||||
|
// bye
|
||||||
10
_test/fun23.go
Normal file
10
_test/fun23.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func f(x int) { return x }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
print("hello")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error:
|
||||||
|
// 3:17: too many arguments to return
|
||||||
10
_test/fun24.go
Normal file
10
_test/fun24.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func f(x int) (int, int) { return x, "foo" }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
print("hello")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error:
|
||||||
|
// cannot use "foo" (type stringT) as type intT in return argument
|
||||||
10
_test/fun25.go
Normal file
10
_test/fun25.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func f(x string) (a int, b int) { return x, 5 }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
print("hello")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error:
|
||||||
|
// cannot use x (type stringT) as type intT in return argument
|
||||||
17
_test/fun26.go
Normal file
17
_test/fun26.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type F func() (int, error)
|
||||||
|
|
||||||
|
func f1() (int, error) { return 3, nil }
|
||||||
|
|
||||||
|
func f2(a string, f F) {
|
||||||
|
c, _ := f()
|
||||||
|
println(a, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
f2("hello", F(f1))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// hello 3
|
||||||
12
_test/goto1.go
Normal file
12
_test/goto1.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if true {
|
||||||
|
goto here
|
||||||
|
}
|
||||||
|
here:
|
||||||
|
println("ok")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// ok
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/foo"
|
import "github.com/traefik/yaegi/_test/foo"
|
||||||
|
|
||||||
func main() { println(foo.Bar, foo.Boo) }
|
func main() { println(foo.Bar, foo.Boo) }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/p1"
|
import "github.com/traefik/yaegi/_test/p1"
|
||||||
|
|
||||||
func main() { println("num:", p1.Uint32()) }
|
func main() { println("num:", p1.Uint32()) }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import boo "github.com/containous/yaegi/_test/foo"
|
import boo "github.com/traefik/yaegi/_test/foo"
|
||||||
|
|
||||||
func main() { println(boo.Bar, boo.Boo, boo.Bir) }
|
func main() { println(boo.Bar, boo.Boo, boo.Bir) }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/c1"
|
import "github.com/traefik/yaegi/_test/c1"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
println(c1.C1)
|
println(c1.C1)
|
||||||
@@ -8,4 +8,4 @@ func main() {
|
|||||||
|
|
||||||
// Error:
|
// Error:
|
||||||
// import cycle not allowed
|
// import cycle not allowed
|
||||||
// imports github.com/containous/yaegi/_test/c1
|
// imports github.com/traefik/yaegi/_test/c1
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/foo-bar"
|
import bar "github.com/traefik/yaegi/_test/foo-bar"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
println(bar.Name)
|
println(bar.Name)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/containous/yaegi/_test/b1/foo"
|
import "github.com/traefik/yaegi/_test/b1/foo"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
println(foo.Desc)
|
println(foo.Desc)
|
||||||
|
|||||||
10
_test/import9.go
Normal file
10
_test/import9.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "github.com/traefik/yaegi/_test/baz-bat"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println(baz.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// baz-bat
|
||||||
@@ -3,14 +3,14 @@ package main
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/containous/yaegi/interp"
|
"github.com/traefik/yaegi/interp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.SetFlags(log.Lshortfile)
|
log.SetFlags(log.Lshortfile)
|
||||||
i := interp.New(interp.Options{})
|
i := interp.New(interp.Options{})
|
||||||
i.Use(interp.Symbols)
|
i.Use(interp.Symbols)
|
||||||
if _, err := i.Eval(`import "github.com/containous/yaegi/interp"`); err != nil {
|
if _, err := i.Eval(`import "github.com/traefik/yaegi/interp"`); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
if _, err := i.Eval(`i := interp.New(interp.Options{})`); err != nil {
|
if _, err := i.Eval(`i := interp.New(interp.Options{})`); err != nil {
|
||||||
@@ -20,6 +20,3 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output:
|
|
||||||
// 42
|
|
||||||
|
|||||||
12
_test/init1.go
Normal file
12
_test/init1.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
println("here")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error:
|
||||||
|
// _test/init1.go:8:2: undefined: init
|
||||||
12
_test/interface42.go
Normal file
12
_test/interface42.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v := interface{}(0)
|
||||||
|
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 0
|
||||||
12
_test/interface43.go
Normal file
12
_test/interface43.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
v := interface{}(nil)
|
||||||
|
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// <nil>
|
||||||
19
_test/interface44.go
Normal file
19
_test/interface44.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type S struct {
|
||||||
|
a int
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var i interface{} = S{a: 1}
|
||||||
|
|
||||||
|
s, ok := i.(S)
|
||||||
|
if !ok {
|
||||||
|
println("bad")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
println(s.a)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 1
|
||||||
13
_test/interface45.go
Normal file
13
_test/interface45.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var i interface{} = 1
|
||||||
|
var s struct{}
|
||||||
|
s, _ = i.(struct{})
|
||||||
|
fmt.Println(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// {}
|
||||||
35
_test/interface46.go
Normal file
35
_test/interface46.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type I interface {
|
||||||
|
Foo() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Printer struct {
|
||||||
|
i I
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(i I) *Printer {
|
||||||
|
return &Printer{
|
||||||
|
i: i,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Printer) Print() {
|
||||||
|
fmt.Println(p.i.Foo())
|
||||||
|
}
|
||||||
|
|
||||||
|
type T struct{}
|
||||||
|
|
||||||
|
func (t *T) Foo() string {
|
||||||
|
return "test"
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
g := New(&T{})
|
||||||
|
g.Print()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// test
|
||||||
32
_test/interface47.go
Normal file
32
_test/interface47.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type Doer interface {
|
||||||
|
Do() error
|
||||||
|
}
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *T) Do() error { println("in do"); return nil }
|
||||||
|
|
||||||
|
func f() (Doer, error) { return &T{"truc"}, nil }
|
||||||
|
|
||||||
|
type Ev struct {
|
||||||
|
doer func() (Doer, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Ev) do() {
|
||||||
|
d, _ := e.doer()
|
||||||
|
d.Do()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
e := &Ev{f}
|
||||||
|
println(e != nil)
|
||||||
|
e.do()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// true
|
||||||
|
// in do
|
||||||
17
_test/interface48.go
Normal file
17
_test/interface48.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type I1 interface{ A }
|
||||||
|
|
||||||
|
type A = I2
|
||||||
|
|
||||||
|
type I2 interface{ F() I1 }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var i I1
|
||||||
|
fmt.Println(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// <nil>
|
||||||
45
_test/interface49.go
Normal file
45
_test/interface49.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type Descriptor interface {
|
||||||
|
ParentFile() FileDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileDescriptor interface {
|
||||||
|
Enums() EnumDescriptors
|
||||||
|
Services() ServiceDescriptors
|
||||||
|
}
|
||||||
|
|
||||||
|
type EnumDescriptors interface {
|
||||||
|
Get(i int) EnumDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
type EnumDescriptor interface {
|
||||||
|
Values() EnumValueDescriptors
|
||||||
|
}
|
||||||
|
|
||||||
|
type EnumValueDescriptors interface {
|
||||||
|
Get(i int) EnumValueDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
type EnumValueDescriptor interface {
|
||||||
|
Descriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServiceDescriptors interface {
|
||||||
|
Get(i int) ServiceDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServiceDescriptor interface {
|
||||||
|
Descriptor
|
||||||
|
isServiceDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
type isServiceDescriptor interface{ ProtoType(ServiceDescriptor) }
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var d Descriptor
|
||||||
|
println(d == nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// true
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/containous/yaegi/interp"
|
"github.com/traefik/yaegi/interp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/containous/yaegi/interp"
|
"github.com/traefik/yaegi/interp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
i := interp.New(interp.Opt{})
|
i := interp.New(interp.Opt{})
|
||||||
i.Use(interp.ExportValue, interp.ExportType)
|
i.Use(interp.ExportValue, interp.ExportType)
|
||||||
i.Eval(`import "github.com/containous/yaegi/interp"`)
|
i.Eval(`import "github.com/traefik/yaegi/interp"`)
|
||||||
i.Eval(`i := interp.New(interp.Opt{})`)
|
i.Eval(`i := interp.New(interp.Opt{})`)
|
||||||
i.Eval(`i.Eval("println(42)")`)
|
i.Eval(`i.Eval("println(42)")`)
|
||||||
}
|
}
|
||||||
|
|||||||
16
_test/ipp_as_key.go
Normal file
16
_test/ipp_as_key.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"guthib.com/toto" // pkg name is actually titi
|
||||||
|
"guthib.com/tata" // pkg name is actually tutu
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println("Hello", titi.Quux())
|
||||||
|
println("Hello", tutu.Quux())
|
||||||
|
}
|
||||||
|
|
||||||
|
// GOPATH:testdata/redeclaration-global7
|
||||||
|
// Output:
|
||||||
|
// Hello bar
|
||||||
|
// Hello baz
|
||||||
40
_test/issue-1007.go
Normal file
40
_test/issue-1007.go
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type TypeA struct {
|
||||||
|
B TypeB
|
||||||
|
}
|
||||||
|
|
||||||
|
type TypeB struct {
|
||||||
|
C1 *TypeC
|
||||||
|
C2 *TypeC
|
||||||
|
}
|
||||||
|
|
||||||
|
type TypeC struct {
|
||||||
|
Val string
|
||||||
|
D *TypeD
|
||||||
|
D2 *TypeD
|
||||||
|
}
|
||||||
|
|
||||||
|
type TypeD struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func build() *TypeA {
|
||||||
|
return &TypeA{
|
||||||
|
B: TypeB{
|
||||||
|
C2: &TypeC{Val: "22"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Bar(s string) string {
|
||||||
|
a := build()
|
||||||
|
return s + "-" + a.B.C2.Val
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println(Bar("test"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// test-22
|
||||||
29
_test/issue-735.go
Normal file
29
_test/issue-735.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
var optionsG map[string]string
|
||||||
|
|
||||||
|
var roundG int = 30
|
||||||
|
|
||||||
|
func strToInt(s string, defaultValue int) int {
|
||||||
|
n, err := strconv.ParseInt(s, 10, 0)
|
||||||
|
if err != nil {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return int(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
optionsG := map[string]string{"round": "12", "b": "one"}
|
||||||
|
roundG = strToInt(optionsG["round"], 50)
|
||||||
|
fmt.Println(roundG)
|
||||||
|
fmt.Println(optionsG)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 12
|
||||||
|
// map[b:one round:12]
|
||||||
25
_test/issue-770.go
Normal file
25
_test/issue-770.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
type I interface {
|
||||||
|
Foo() int
|
||||||
|
}
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t T) Foo() int { return 0 }
|
||||||
|
|
||||||
|
func f(v reflect.Value) int {
|
||||||
|
i := v.Interface().(I)
|
||||||
|
return i.Foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println("hello")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// hello
|
||||||
31
_test/issue-772.go
Normal file
31
_test/issue-772.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"text/template"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
Data string
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tmpl := template.New("name")
|
||||||
|
|
||||||
|
_, err := tmpl.Parse("{{.Data}}")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = tmpl.Execute(os.Stdout, Message{
|
||||||
|
Data: "Hello, World!!",
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Hello, World!!
|
||||||
18
_test/issue-775.go
Normal file
18
_test/issue-775.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http/httptest"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
recorder.Header().Add("Foo", "Bar")
|
||||||
|
|
||||||
|
for key, value := range recorder.Header() {
|
||||||
|
fmt.Println(key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Foo [Bar]
|
||||||
39
_test/issue-776.go
Normal file
39
_test/issue-776.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// Filter is a filter
|
||||||
|
type Filter interface {
|
||||||
|
Foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GIFT is a gift
|
||||||
|
type GIFT struct {
|
||||||
|
Filters []Filter
|
||||||
|
}
|
||||||
|
|
||||||
|
// New is a new filter list
|
||||||
|
func New(filters ...Filter) *GIFT {
|
||||||
|
return &GIFT{
|
||||||
|
Filters: filters,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// List lists filters
|
||||||
|
func (g *GIFT) List() {
|
||||||
|
fmt.Printf("Hello from List!\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MyFilter is one of the filters
|
||||||
|
type MyFilter struct{}
|
||||||
|
|
||||||
|
// Foo is a foo
|
||||||
|
func (f *MyFilter) Foo() {}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
g := New(&MyFilter{})
|
||||||
|
g.List()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// Hello from List!
|
||||||
14
_test/issue-782.go
Normal file
14
_test/issue-782.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
|
||||||
|
from := uint32(2)
|
||||||
|
to := uint32(4)
|
||||||
|
b := a[from:to]
|
||||||
|
fmt.Print(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [3 4]
|
||||||
39
_test/issue-784.go
Normal file
39
_test/issue-784.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// Filter is a filter interface
|
||||||
|
type Filter interface {
|
||||||
|
Bounds(srcBounds string) (dstBounds string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GIFT type
|
||||||
|
type GIFT struct {
|
||||||
|
Filters []Filter
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new filter list and initializes it with the given slice of filters.
|
||||||
|
func New(filters ...Filter) *GIFT {
|
||||||
|
return &GIFT{
|
||||||
|
Filters: filters,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bounds calculates the appropriate bounds for the result image after applying all the added filters.
|
||||||
|
func (g *GIFT) Bounds(srcBounds string) (dstBounds string) {
|
||||||
|
dstBounds = srcBounds
|
||||||
|
for _, f := range g.Filters {
|
||||||
|
dstBounds = f.Bounds(dstBounds)
|
||||||
|
}
|
||||||
|
return dstBounds
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var filters []Filter
|
||||||
|
bounds := "foo"
|
||||||
|
g := New(filters...)
|
||||||
|
fmt.Println(g.Bounds(bounds))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user