goscript 0.0.13 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -1
- package/README.md +163 -45
- package/builtin/builtin.ts +1169 -178
- package/cmd/goscript/cmd_compile.go +2 -2
- package/compiler/analysis.go +726 -0
- package/compiler/compiler.go +5701 -4
- package/compiler/compiler_test.go +104 -0
- package/compiler/config.go +3 -3
- package/compiler/config_test.go +89 -0
- package/compiler/index.ts +1 -1
- package/compiler/output.go +26 -0
- package/compiler/write-type-spec.go +506 -0
- package/compiler/writer.go +11 -0
- package/dist/builtin/builtin.d.ts +204 -67
- package/dist/builtin/builtin.js +846 -144
- package/dist/builtin/builtin.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -1
- package/go.mod +5 -6
- package/go.sum +6 -11
- package/package.json +21 -5
- package/compiler/compile.go +0 -190
- package/compiler/compile_comment.go +0 -41
- package/compiler/compile_decls.go +0 -84
- package/compiler/compile_expr.go +0 -1022
- package/compiler/compile_field.go +0 -110
- package/compiler/compile_spec.go +0 -566
- package/compiler/compile_stmt.go +0 -1616
- package/compiler/context.go +0 -9
- package/compiler/file_compiler.go +0 -80
- package/compiler/output_path.go +0 -31
- package/compiler/pkg_compiler.go +0 -72
- package/compiler/types/tokens.go +0 -66
- package/compiler/types/types.go +0 -46
- package/dist/compliance/tests/array_literal/array_literal.gs.d.ts +0 -1
- package/dist/compliance/tests/array_literal/array_literal.gs.js +0 -15
- package/dist/compliance/tests/array_literal/array_literal.gs.js.map +0 -1
- package/dist/compliance/tests/async_basic/async_basic.gs.d.ts +0 -1
- package/dist/compliance/tests/async_basic/async_basic.gs.js +0 -24
- package/dist/compliance/tests/async_basic/async_basic.gs.js.map +0 -1
- package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.d.ts +0 -1
- package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.js +0 -82
- package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.js.map +0 -1
- package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.d.ts +0 -1
- package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.js +0 -16
- package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.js.map +0 -1
- package/dist/compliance/tests/boolean_logic/boolean_logic.gs.d.ts +0 -1
- package/dist/compliance/tests/boolean_logic/boolean_logic.gs.js +0 -14
- package/dist/compliance/tests/boolean_logic/boolean_logic.gs.js.map +0 -1
- package/dist/compliance/tests/channel_basic/channel_basic.gs.d.ts +0 -1
- package/dist/compliance/tests/channel_basic/channel_basic.gs.js +0 -14
- package/dist/compliance/tests/channel_basic/channel_basic.gs.js.map +0 -1
- package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.d.ts +0 -1
- package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.js +0 -27
- package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.js.map +0 -1
- package/dist/compliance/tests/constants/constants.gs.d.ts +0 -1
- package/dist/compliance/tests/constants/constants.gs.js +0 -16
- package/dist/compliance/tests/constants/constants.gs.js.map +0 -1
- package/dist/compliance/tests/copy_independence/copy_independence.gs.d.ts +0 -1
- package/dist/compliance/tests/copy_independence/copy_independence.gs.js +0 -33
- package/dist/compliance/tests/copy_independence/copy_independence.gs.js.map +0 -1
- package/dist/compliance/tests/defer_statement/defer_statement.gs.d.ts +0 -1
- package/dist/compliance/tests/defer_statement/defer_statement.gs.js +0 -75
- package/dist/compliance/tests/defer_statement/defer_statement.gs.js.map +0 -1
- package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.d.ts +0 -1
- package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.js +0 -37
- package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.js.map +0 -1
- package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.d.ts +0 -1
- package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.js +0 -29
- package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.js.map +0 -1
- package/dist/compliance/tests/float64/float64.gs.d.ts +0 -1
- package/dist/compliance/tests/float64/float64.gs.js +0 -24
- package/dist/compliance/tests/float64/float64.gs.js.map +0 -1
- package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.d.ts +0 -1
- package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.js +0 -10
- package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.js.map +0 -1
- package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.d.ts +0 -1
- package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.js +0 -11
- package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.js.map +0 -1
- package/dist/compliance/tests/for_loop_condition_only/main.gs.d.ts +0 -1
- package/dist/compliance/tests/for_loop_condition_only/main.gs.js +0 -10
- package/dist/compliance/tests/for_loop_condition_only/main.gs.js.map +0 -1
- package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.d.ts +0 -1
- package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.js +0 -14
- package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.js.map +0 -1
- package/dist/compliance/tests/for_range/for_range.gs.d.ts +0 -1
- package/dist/compliance/tests/for_range/for_range.gs.js +0 -39
- package/dist/compliance/tests/for_range/for_range.gs.js.map +0 -1
- package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.d.ts +0 -1
- package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.js +0 -15
- package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.js.map +0 -1
- package/dist/compliance/tests/func_literal/func_literal.gs.d.ts +0 -1
- package/dist/compliance/tests/func_literal/func_literal.gs.js +0 -10
- package/dist/compliance/tests/func_literal/func_literal.gs.js.map +0 -1
- package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.d.ts +0 -12
- package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.js +0 -30
- package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.js.map +0 -1
- package/dist/compliance/tests/if_statement/if_statement.gs.d.ts +0 -1
- package/dist/compliance/tests/if_statement/if_statement.gs.js +0 -13
- package/dist/compliance/tests/if_statement/if_statement.gs.js.map +0 -1
- package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.d.ts +0 -1
- package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.js +0 -12
- package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.js.map +0 -1
- package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.d.ts +0 -1
- package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.js +0 -34
- package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.js.map +0 -1
- package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.d.ts +0 -1
- package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.js +0 -32
- package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.js.map +0 -1
- package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.d.ts +0 -1
- package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.js +0 -40
- package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.js.map +0 -1
- package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.d.ts +0 -1
- package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.js +0 -51
- package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.js.map +0 -1
- package/dist/compliance/tests/map_support/map_support.gs.d.ts +0 -1
- package/dist/compliance/tests/map_support/map_support.gs.js +0 -88
- package/dist/compliance/tests/map_support/map_support.gs.js.map +0 -1
- package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.d.ts +0 -1
- package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.js +0 -24
- package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.js.map +0 -1
- package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.d.ts +0 -1
- package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.js +0 -33
- package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.js.map +0 -1
- package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.d.ts +0 -1
- package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.js +0 -22
- package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.js.map +0 -1
- package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.d.ts +0 -1
- package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.js +0 -33
- package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.js.map +0 -1
- package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.d.ts +0 -1
- package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.js +0 -17
- package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.js.map +0 -1
- package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.d.ts +0 -1
- package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.js +0 -29
- package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.js.map +0 -1
- package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.d.ts +0 -1
- package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.js +0 -27
- package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.js.map +0 -1
- package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.d.ts +0 -1
- package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.js +0 -22
- package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.js.map +0 -1
- package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.d.ts +0 -1
- package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.js +0 -20
- package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.js.map +0 -1
- package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.d.ts +0 -1
- package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.js +0 -28
- package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.js.map +0 -1
- package/dist/compliance/tests/select_send_on_full_buffered_channel_with_default/select_send_on_full_buffered_channel_with_default.gs.d.ts +0 -1
- package/dist/compliance/tests/select_send_on_full_buffered_channel_with_default/select_send_on_full_buffered_channel_with_default.gs.js +0 -30
- package/dist/compliance/tests/select_send_on_full_buffered_channel_with_default/select_send_on_full_buffered_channel_with_default.gs.js.map +0 -1
- package/dist/compliance/tests/select_statement/select_statement.gs.d.ts +0 -1
- package/dist/compliance/tests/select_statement/select_statement.gs.js +0 -207
- package/dist/compliance/tests/select_statement/select_statement.gs.js.map +0 -1
- package/dist/compliance/tests/simple/simple.gs.d.ts +0 -1
- package/dist/compliance/tests/simple/simple.gs.js +0 -6
- package/dist/compliance/tests/simple/simple.gs.js.map +0 -1
- package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.d.ts +0 -1
- package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.js +0 -24
- package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.js.map +0 -1
- package/dist/compliance/tests/slices/slices.gs.d.ts +0 -1
- package/dist/compliance/tests/slices/slices.gs.js +0 -294
- package/dist/compliance/tests/slices/slices.gs.js.map +0 -1
- package/dist/compliance/tests/string_conversion/string_conversion.gs.d.ts +0 -1
- package/dist/compliance/tests/string_conversion/string_conversion.gs.js +0 -41
- package/dist/compliance/tests/string_conversion/string_conversion.gs.js.map +0 -1
- package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.d.ts +0 -1
- package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.js +0 -17
- package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.js.map +0 -1
- package/dist/compliance/tests/struct_embedding/struct_embedding.gs.d.ts +0 -1
- package/dist/compliance/tests/struct_embedding/struct_embedding.gs.js +0 -48
- package/dist/compliance/tests/struct_embedding/struct_embedding.gs.js.map +0 -1
- package/dist/compliance/tests/struct_field_access/struct_field_access.gs.d.ts +0 -1
- package/dist/compliance/tests/struct_field_access/struct_field_access.gs.js +0 -19
- package/dist/compliance/tests/struct_field_access/struct_field_access.gs.js.map +0 -1
- package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.d.ts +0 -1
- package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.js +0 -26
- package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.js.map +0 -1
- package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.d.ts +0 -1
- package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.js +0 -30
- package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.js.map +0 -1
- package/dist/compliance/tests/switch_statement/switch_statement.gs.d.ts +0 -1
- package/dist/compliance/tests/switch_statement/switch_statement.gs.js +0 -76
- package/dist/compliance/tests/switch_statement/switch_statement.gs.js.map +0 -1
- package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.d.ts +0 -1
- package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.js +0 -31
- package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.js.map +0 -1
package/LICENSE
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2024-2025 Aperture Robotics, LLC.
|
|
4
|
+
Copyright (c) 2019-2025 Christian Stewart
|
|
4
5
|
|
|
5
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
7
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
[![GoDoc Widget]][GoDoc] [![Go Report Card Widget]][Go Report Card]
|
|
4
4
|
|
|
5
|
-
[GoDoc]: https://godoc.org/github.com/
|
|
6
|
-
[GoDoc Widget]: https://godoc.org/github.com/
|
|
7
|
-
[Go Report Card Widget]: https://goreportcard.com/badge/github.com/
|
|
8
|
-
[Go Report Card]: https://goreportcard.com/report/github.com/
|
|
5
|
+
[GoDoc]: https://godoc.org/github.com/aperturerobotics/goscript
|
|
6
|
+
[GoDoc Widget]: https://godoc.org/github.com/aperturerobotics/goscript?status.svg
|
|
7
|
+
[Go Report Card Widget]: https://goreportcard.com/badge/github.com/aperturerobotics/goscript
|
|
8
|
+
[Go Report Card]: https://goreportcard.com/report/github.com/aperturerobotics/goscript
|
|
9
9
|
|
|
10
10
|
## Introduction
|
|
11
11
|
|
|
@@ -15,6 +15,10 @@ It works on translating Go to TypeScript on the AST level.
|
|
|
15
15
|
|
|
16
16
|
For detailed information on the compiler's design, refer to the [design document](./design/DESIGN.md).
|
|
17
17
|
|
|
18
|
+
> Right now goscript looks pretty cool if you problem is "I want this self-sufficient algorithm be available in Go and JS runtimes". gopherjs's ambition, however, has always been "any valid Go program can run in a browser". There is a lot that goes on in gopherjs that is necessary for supporting the standard library, which goes beyond cross-language translation.
|
|
19
|
+
>
|
|
20
|
+
> — [nevkontakte](https://gophers.slack.com/archives/C039C0R2T/p1745870396945719), developer of [GopherJS](https://github.com/gopherjs/gopherjs)
|
|
21
|
+
|
|
18
22
|
GoScript intends to compile a subset of the Go language to TypeScript in a
|
|
19
23
|
non-spec-compliant way. It is intended only for bringing over high-level logic
|
|
20
24
|
from Go to TypeScript, so not all programs will work correctly:
|
|
@@ -60,40 +64,40 @@ You can also use the compiler directly within your Go code. Here's a basic examp
|
|
|
60
64
|
package main
|
|
61
65
|
|
|
62
66
|
import (
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
"context"
|
|
68
|
+
"log"
|
|
65
69
|
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
"github.com/aperturerobotics/goscript/compiler"
|
|
71
|
+
"github.com/sirupsen/logrus"
|
|
68
72
|
)
|
|
69
73
|
|
|
70
74
|
func main() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
75
|
+
// Initialize logger (optional)
|
|
76
|
+
logger := logrus.New()
|
|
77
|
+
logger.SetLevel(logrus.DebugLevel) // Adjust log level as needed
|
|
78
|
+
le := logrus.NewEntry(logger)
|
|
79
|
+
|
|
80
|
+
// Configure the compiler
|
|
81
|
+
conf := &compiler.Config{
|
|
82
|
+
OutputPathRoot: "./ts_output", // Directory for generated TypeScript files
|
|
83
|
+
}
|
|
84
|
+
if err := conf.Validate(); err != nil {
|
|
85
|
+
log.Fatalf("invalid compiler config: %v", err)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Create a new compiler instance
|
|
89
|
+
comp, err := compiler.NewCompiler(conf, le, nil) // Pass nil for default package loading options
|
|
90
|
+
if err != nil {
|
|
91
|
+
log.Fatalf("failed to create compiler: %v", err)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Compile the desired Go package(s)
|
|
95
|
+
// Replace "." with the specific Go import path of the package you want to compile
|
|
96
|
+
if err := comp.CompilePackages(context.Background(), "your/go/package/path"); err != nil {
|
|
97
|
+
log.Fatalf("compilation failed: %v", err)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
log.Println("Compilation successful!")
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
```
|
|
@@ -222,9 +226,41 @@ func main() {
|
|
|
222
226
|
arr := [3]int{1, 2, 3}
|
|
223
227
|
println("Array elements:", arr[0], arr[1], arr[2])
|
|
224
228
|
|
|
225
|
-
// Slices and
|
|
229
|
+
// Slices - Basic initialization and access
|
|
226
230
|
slice := []int{4, 5, 6}
|
|
227
231
|
println("Slice elements:", slice[0], slice[1], slice[2])
|
|
232
|
+
println("Slice length:", len(slice), "capacity:", cap(slice))
|
|
233
|
+
|
|
234
|
+
sliceWithCap := make([]int, 3, 5)
|
|
235
|
+
println("\nSlice created with make([]int, 3, 5):")
|
|
236
|
+
println("Length:", len(sliceWithCap), "Capacity:", cap(sliceWithCap))
|
|
237
|
+
|
|
238
|
+
println("\nAppend and capacity growth:")
|
|
239
|
+
growingSlice := make([]int, 0, 2)
|
|
240
|
+
println("Initial - Length:", len(growingSlice), "Capacity:", cap(growingSlice))
|
|
241
|
+
|
|
242
|
+
for i := 1; i <= 4; i++ {
|
|
243
|
+
growingSlice = append(growingSlice, i)
|
|
244
|
+
println("After append", i, "- Length:", len(growingSlice), "Capacity:", cap(growingSlice))
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
println("\nSlicing operations and shared backing arrays:")
|
|
248
|
+
original := []int{10, 20, 30, 40, 50}
|
|
249
|
+
println("Original slice - Length:", len(original), "Capacity:", cap(original))
|
|
250
|
+
|
|
251
|
+
slice1 := original[1:3]
|
|
252
|
+
println("slice1 := original[1:3] - Values:", slice1[0], slice1[1])
|
|
253
|
+
println("slice1 - Length:", len(slice1), "Capacity:", cap(slice1))
|
|
254
|
+
|
|
255
|
+
slice2 := original[1:3:4]
|
|
256
|
+
println("slice2 := original[1:3:4] - Values:", slice2[0], slice2[1])
|
|
257
|
+
println("slice2 - Length:", len(slice2), "Capacity:", cap(slice2))
|
|
258
|
+
|
|
259
|
+
println("\nShared backing arrays:")
|
|
260
|
+
slice1[0] = 999
|
|
261
|
+
println("After slice1[0] = 999:")
|
|
262
|
+
println("original[1]:", original[1], "slice1[0]:", slice1[0], "slice2[0]:", slice2[0])
|
|
263
|
+
|
|
228
264
|
sum := 0
|
|
229
265
|
for idx, val := range slice {
|
|
230
266
|
sum += val
|
|
@@ -290,9 +326,24 @@ func main() {
|
|
|
290
326
|
println("Goroutine: Sending message")
|
|
291
327
|
ch <- "Hello from goroutine!"
|
|
292
328
|
}()
|
|
329
|
+
|
|
293
330
|
msg := <-ch
|
|
294
331
|
println("Main goroutine: Received message:", msg)
|
|
295
332
|
|
|
333
|
+
// Select statement
|
|
334
|
+
println("\nSelect statement:")
|
|
335
|
+
selectCh := make(chan string)
|
|
336
|
+
go func() {
|
|
337
|
+
selectCh <- "Message from select goroutine!"
|
|
338
|
+
}()
|
|
339
|
+
anotherCh := make(chan string)
|
|
340
|
+
select {
|
|
341
|
+
case selectMsg := <-selectCh:
|
|
342
|
+
println("Select received:", selectMsg)
|
|
343
|
+
case anotherMsg := <-anotherCh: // Add another case
|
|
344
|
+
println("Select received from another channel:", anotherMsg)
|
|
345
|
+
}
|
|
346
|
+
|
|
296
347
|
// Function Literals
|
|
297
348
|
println("\nFunction Literals:")
|
|
298
349
|
add := func(x, y int) int {
|
|
@@ -306,7 +357,7 @@ func main() {
|
|
|
306
357
|
Generated with `goscript compile .`:
|
|
307
358
|
|
|
308
359
|
```typescript
|
|
309
|
-
import * as
|
|
360
|
+
import * as $ from "@goscript/builtin"
|
|
310
361
|
|
|
311
362
|
class MyStruct {
|
|
312
363
|
// MyInt is a public integer field, initialized to zero.
|
|
@@ -369,12 +420,44 @@ export async function main(): Promise<void> {
|
|
|
369
420
|
console.log("string(0x221A):", s3)
|
|
370
421
|
|
|
371
422
|
// Arrays
|
|
372
|
-
let arr = [1, 2, 3]
|
|
373
|
-
console.log("Array elements:", arr[0], arr[1], arr[2])
|
|
423
|
+
let arr = $.arrayToSlice([1, 2, 3])
|
|
424
|
+
console.log("Array elements:", arr![0], arr![1], arr![2])
|
|
425
|
+
|
|
426
|
+
// Slices - Basic initialization and access
|
|
427
|
+
let slice = $.arrayToSlice([4, 5, 6])
|
|
428
|
+
console.log("Slice elements:", slice![0], slice![1], slice![2])
|
|
429
|
+
console.log("Slice length:", $.len(slice), "capacity:", $.cap(slice))
|
|
430
|
+
|
|
431
|
+
let sliceWithCap = $.makeSlice<number>(3, 5)
|
|
432
|
+
console.log("\nSlice created with make([]int, 3, 5):")
|
|
433
|
+
console.log("Length:", $.len(sliceWithCap), "Capacity:", $.cap(sliceWithCap))
|
|
434
|
+
|
|
435
|
+
console.log("\nAppend and capacity growth:")
|
|
436
|
+
let growingSlice = $.makeSlice<number>(0, 2)
|
|
437
|
+
console.log("Initial - Length:", $.len(growingSlice), "Capacity:", $.cap(growingSlice))
|
|
438
|
+
|
|
439
|
+
for (let i = 1; i <= 4; i++) {
|
|
440
|
+
growingSlice = $.append(growingSlice, i)
|
|
441
|
+
console.log("After append", i, "- Length:", $.len(growingSlice), "Capacity:", $.cap(growingSlice))
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
console.log("\nSlicing operations and shared backing arrays:")
|
|
445
|
+
let original = $.arrayToSlice([10, 20, 30, 40, 50])
|
|
446
|
+
console.log("Original slice - Length:", $.len(original), "Capacity:", $.cap(original))
|
|
447
|
+
|
|
448
|
+
let slice1 = $.goSlice(original, 1, 3)
|
|
449
|
+
console.log("slice1 := original[1:3] - Values:", slice1![0], slice1![1])
|
|
450
|
+
console.log("slice1 - Length:", $.len(slice1), "Capacity:", $.cap(slice1))
|
|
451
|
+
|
|
452
|
+
let slice2 = $.goSlice(original, 1, 3, 4)
|
|
453
|
+
console.log("slice2 := original[1:3:4] - Values:", slice2![0], slice2![1])
|
|
454
|
+
console.log("slice2 - Length:", $.len(slice2), "Capacity:", $.cap(slice2))
|
|
455
|
+
|
|
456
|
+
console.log("\nShared backing arrays:")
|
|
457
|
+
slice1![0] = 999
|
|
458
|
+
console.log("After slice1[0] = 999:")
|
|
459
|
+
console.log("original[1]:", original![1], "slice1[0]:", slice1![0], "slice2[0]:", slice2![0])
|
|
374
460
|
|
|
375
|
-
// Slices and range loop
|
|
376
|
-
let slice = [4, 5, 6]
|
|
377
|
-
console.log("Slice elements:", slice[0], slice[1], slice[2])
|
|
378
461
|
let sum = 0
|
|
379
462
|
for (let idx = 0; idx < slice.length; idx++) {
|
|
380
463
|
const val = slice[idx]
|
|
@@ -440,14 +523,49 @@ export async function main(): Promise<void> {
|
|
|
440
523
|
|
|
441
524
|
// Goroutines and Channels
|
|
442
525
|
console.log("\nGoroutines and Channels:")
|
|
443
|
-
let ch =
|
|
526
|
+
let ch = $.makeChannel<string>(0, "")
|
|
444
527
|
queueMicrotask(async () => {
|
|
445
|
-
|
|
446
|
-
|
|
528
|
+
{
|
|
529
|
+
console.log("Goroutine: Sending message")
|
|
530
|
+
await ch.send("Hello from goroutine!")
|
|
531
|
+
}
|
|
447
532
|
})
|
|
533
|
+
|
|
448
534
|
let msg = await ch.receive()
|
|
449
535
|
console.log("Main goroutine: Received message:", msg)
|
|
450
536
|
|
|
537
|
+
// Select statement
|
|
538
|
+
console.log("\nSelect statement:")
|
|
539
|
+
let selectCh = $.makeChannel<string>(0, "")
|
|
540
|
+
queueMicrotask(async () => {
|
|
541
|
+
{
|
|
542
|
+
await selectCh.send("Message from select goroutine!")
|
|
543
|
+
}
|
|
544
|
+
})
|
|
545
|
+
let anotherCh = $.makeChannel<string>(0, "")
|
|
546
|
+
|
|
547
|
+
// Add another case
|
|
548
|
+
await $.selectStatement([
|
|
549
|
+
{
|
|
550
|
+
id: 0,
|
|
551
|
+
isSend: false,
|
|
552
|
+
channel: selectCh,
|
|
553
|
+
onSelected: async (result) => {
|
|
554
|
+
const selectMsg = result.value
|
|
555
|
+
console.log("Select received:", selectMsg)
|
|
556
|
+
}
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
id: 1,
|
|
560
|
+
isSend: false,
|
|
561
|
+
channel: anotherCh,
|
|
562
|
+
onSelected: async (result) => {
|
|
563
|
+
const anotherMsg = result.value
|
|
564
|
+
console.log("Select received from another channel:", anotherMsg)
|
|
565
|
+
}
|
|
566
|
+
},
|
|
567
|
+
], false)
|
|
568
|
+
|
|
451
569
|
// Function Literals
|
|
452
570
|
console.log("\nFunction Literals:")
|
|
453
571
|
let add = (x: number, y: number): number => {
|
|
@@ -480,4 +598,4 @@ async function runGoCode() {
|
|
|
480
598
|
|
|
481
599
|
## License
|
|
482
600
|
|
|
483
|
-
MIT
|
|
601
|
+
MIT
|