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.
Files changed (186) hide show
  1. package/LICENSE +2 -1
  2. package/README.md +163 -45
  3. package/builtin/builtin.ts +1169 -178
  4. package/cmd/goscript/cmd_compile.go +2 -2
  5. package/compiler/analysis.go +726 -0
  6. package/compiler/compiler.go +5701 -4
  7. package/compiler/compiler_test.go +104 -0
  8. package/compiler/config.go +3 -3
  9. package/compiler/config_test.go +89 -0
  10. package/compiler/index.ts +1 -1
  11. package/compiler/output.go +26 -0
  12. package/compiler/write-type-spec.go +506 -0
  13. package/compiler/writer.go +11 -0
  14. package/dist/builtin/builtin.d.ts +204 -67
  15. package/dist/builtin/builtin.js +846 -144
  16. package/dist/builtin/builtin.js.map +1 -1
  17. package/dist/compiler/index.d.ts +1 -1
  18. package/go.mod +5 -6
  19. package/go.sum +6 -11
  20. package/package.json +21 -5
  21. package/compiler/compile.go +0 -190
  22. package/compiler/compile_comment.go +0 -41
  23. package/compiler/compile_decls.go +0 -84
  24. package/compiler/compile_expr.go +0 -1022
  25. package/compiler/compile_field.go +0 -110
  26. package/compiler/compile_spec.go +0 -566
  27. package/compiler/compile_stmt.go +0 -1616
  28. package/compiler/context.go +0 -9
  29. package/compiler/file_compiler.go +0 -80
  30. package/compiler/output_path.go +0 -31
  31. package/compiler/pkg_compiler.go +0 -72
  32. package/compiler/types/tokens.go +0 -66
  33. package/compiler/types/types.go +0 -46
  34. package/dist/compliance/tests/array_literal/array_literal.gs.d.ts +0 -1
  35. package/dist/compliance/tests/array_literal/array_literal.gs.js +0 -15
  36. package/dist/compliance/tests/array_literal/array_literal.gs.js.map +0 -1
  37. package/dist/compliance/tests/async_basic/async_basic.gs.d.ts +0 -1
  38. package/dist/compliance/tests/async_basic/async_basic.gs.js +0 -24
  39. package/dist/compliance/tests/async_basic/async_basic.gs.js.map +0 -1
  40. package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.d.ts +0 -1
  41. package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.js +0 -82
  42. package/dist/compliance/tests/async_defer_statement/async_defer_statement.gs.js.map +0 -1
  43. package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.d.ts +0 -1
  44. package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.js +0 -16
  45. package/dist/compliance/tests/basic_arithmetic/basic_arithmetic.gs.js.map +0 -1
  46. package/dist/compliance/tests/boolean_logic/boolean_logic.gs.d.ts +0 -1
  47. package/dist/compliance/tests/boolean_logic/boolean_logic.gs.js +0 -14
  48. package/dist/compliance/tests/boolean_logic/boolean_logic.gs.js.map +0 -1
  49. package/dist/compliance/tests/channel_basic/channel_basic.gs.d.ts +0 -1
  50. package/dist/compliance/tests/channel_basic/channel_basic.gs.js +0 -14
  51. package/dist/compliance/tests/channel_basic/channel_basic.gs.js.map +0 -1
  52. package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.d.ts +0 -1
  53. package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.js +0 -27
  54. package/dist/compliance/tests/composite_literal_assignment/composite_literal_assignment.gs.js.map +0 -1
  55. package/dist/compliance/tests/constants/constants.gs.d.ts +0 -1
  56. package/dist/compliance/tests/constants/constants.gs.js +0 -16
  57. package/dist/compliance/tests/constants/constants.gs.js.map +0 -1
  58. package/dist/compliance/tests/copy_independence/copy_independence.gs.d.ts +0 -1
  59. package/dist/compliance/tests/copy_independence/copy_independence.gs.js +0 -33
  60. package/dist/compliance/tests/copy_independence/copy_independence.gs.js.map +0 -1
  61. package/dist/compliance/tests/defer_statement/defer_statement.gs.d.ts +0 -1
  62. package/dist/compliance/tests/defer_statement/defer_statement.gs.js +0 -75
  63. package/dist/compliance/tests/defer_statement/defer_statement.gs.js.map +0 -1
  64. package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.d.ts +0 -1
  65. package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.js +0 -37
  66. package/dist/compliance/tests/embedded_interface_assertion/embedded_interface_assertion.gs.js.map +0 -1
  67. package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.d.ts +0 -1
  68. package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.js +0 -29
  69. package/dist/compliance/tests/flag_bitwise_op/flag_bitwise_op.gs.js.map +0 -1
  70. package/dist/compliance/tests/float64/float64.gs.d.ts +0 -1
  71. package/dist/compliance/tests/float64/float64.gs.js +0 -24
  72. package/dist/compliance/tests/float64/float64.gs.js.map +0 -1
  73. package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.d.ts +0 -1
  74. package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.js +0 -10
  75. package/dist/compliance/tests/for_loop_basic/for_loop_basic.gs.js.map +0 -1
  76. package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.d.ts +0 -1
  77. package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.js +0 -11
  78. package/dist/compliance/tests/for_loop_condition_only/for_loop_condition_only.gs.js.map +0 -1
  79. package/dist/compliance/tests/for_loop_condition_only/main.gs.d.ts +0 -1
  80. package/dist/compliance/tests/for_loop_condition_only/main.gs.js +0 -10
  81. package/dist/compliance/tests/for_loop_condition_only/main.gs.js.map +0 -1
  82. package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.d.ts +0 -1
  83. package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.js +0 -14
  84. package/dist/compliance/tests/for_loop_infinite/for_loop_infinite.gs.js.map +0 -1
  85. package/dist/compliance/tests/for_range/for_range.gs.d.ts +0 -1
  86. package/dist/compliance/tests/for_range/for_range.gs.js +0 -39
  87. package/dist/compliance/tests/for_range/for_range.gs.js.map +0 -1
  88. package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.d.ts +0 -1
  89. package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.js +0 -15
  90. package/dist/compliance/tests/for_range_index_use/for_range_index_use.gs.js.map +0 -1
  91. package/dist/compliance/tests/func_literal/func_literal.gs.d.ts +0 -1
  92. package/dist/compliance/tests/func_literal/func_literal.gs.js +0 -10
  93. package/dist/compliance/tests/func_literal/func_literal.gs.js.map +0 -1
  94. package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.d.ts +0 -12
  95. package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.js +0 -30
  96. package/dist/compliance/tests/function_call_result_assignment/function_call_result_assignment.gs.js.map +0 -1
  97. package/dist/compliance/tests/if_statement/if_statement.gs.d.ts +0 -1
  98. package/dist/compliance/tests/if_statement/if_statement.gs.js +0 -13
  99. package/dist/compliance/tests/if_statement/if_statement.gs.js.map +0 -1
  100. package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.d.ts +0 -1
  101. package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.js +0 -12
  102. package/dist/compliance/tests/interface_method_comments/interface_method_comments.gs.js.map +0 -1
  103. package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.d.ts +0 -1
  104. package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.js +0 -34
  105. package/dist/compliance/tests/interface_multi_param_return/interface_multi_param_return.gs.js.map +0 -1
  106. package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.d.ts +0 -1
  107. package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.js +0 -32
  108. package/dist/compliance/tests/interface_to_interface_type_assertion/interface_to_interface_type_assertion.gs.js.map +0 -1
  109. package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.d.ts +0 -1
  110. package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.js +0 -40
  111. package/dist/compliance/tests/interface_type_assertion/interface_type_assertion.gs.js.map +0 -1
  112. package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.d.ts +0 -1
  113. package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.js +0 -51
  114. package/dist/compliance/tests/interface_type_assertion_signature_mismatch/interface_type_assertion_signature_mismatch.gs.js.map +0 -1
  115. package/dist/compliance/tests/map_support/map_support.gs.d.ts +0 -1
  116. package/dist/compliance/tests/map_support/map_support.gs.js +0 -88
  117. package/dist/compliance/tests/map_support/map_support.gs.js.map +0 -1
  118. package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.d.ts +0 -1
  119. package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.js +0 -24
  120. package/dist/compliance/tests/method_call_on_pointer_receiver/method_call_on_pointer_receiver.gs.js.map +0 -1
  121. package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.d.ts +0 -1
  122. package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.js +0 -33
  123. package/dist/compliance/tests/method_call_on_pointer_via_value/method_call_on_pointer_via_value.gs.js.map +0 -1
  124. package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.d.ts +0 -1
  125. package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.js +0 -22
  126. package/dist/compliance/tests/method_call_on_value_receiver/method_call_on_value_receiver.gs.js.map +0 -1
  127. package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.d.ts +0 -1
  128. package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.js +0 -33
  129. package/dist/compliance/tests/method_call_on_value_via_pointer/method_call_on_value_via_pointer.gs.js.map +0 -1
  130. package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.d.ts +0 -1
  131. package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.js +0 -17
  132. package/dist/compliance/tests/multiple_return_values/multiple_return_values.gs.js.map +0 -1
  133. package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.d.ts +0 -1
  134. package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.js +0 -29
  135. package/dist/compliance/tests/pointer_assignment_no_copy/pointer_assignment_no_copy.gs.js.map +0 -1
  136. package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.d.ts +0 -1
  137. package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.js +0 -27
  138. package/dist/compliance/tests/pointer_composite_literal_assignment/pointer_composite_literal_assignment.gs.js.map +0 -1
  139. package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.d.ts +0 -1
  140. package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.js +0 -22
  141. package/dist/compliance/tests/pointer_deref_multiassign/pointer_deref_multiassign.gs.js.map +0 -1
  142. package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.d.ts +0 -1
  143. package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.js +0 -20
  144. package/dist/compliance/tests/pointer_initialization/pointer_initialization.gs.js.map +0 -1
  145. package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.d.ts +0 -1
  146. package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.js +0 -28
  147. package/dist/compliance/tests/select_receive_on_closed_channel_no_default/select_receive_on_closed_channel_no_default.gs.js.map +0 -1
  148. 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
  149. package/dist/compliance/tests/select_send_on_full_buffered_channel_with_default/select_send_on_full_buffered_channel_with_default.gs.js +0 -30
  150. 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
  151. package/dist/compliance/tests/select_statement/select_statement.gs.d.ts +0 -1
  152. package/dist/compliance/tests/select_statement/select_statement.gs.js +0 -207
  153. package/dist/compliance/tests/select_statement/select_statement.gs.js.map +0 -1
  154. package/dist/compliance/tests/simple/simple.gs.d.ts +0 -1
  155. package/dist/compliance/tests/simple/simple.gs.js +0 -6
  156. package/dist/compliance/tests/simple/simple.gs.js.map +0 -1
  157. package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.d.ts +0 -1
  158. package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.js +0 -24
  159. package/dist/compliance/tests/simple_deref_assignment/simple_deref_assignment.gs.js.map +0 -1
  160. package/dist/compliance/tests/slices/slices.gs.d.ts +0 -1
  161. package/dist/compliance/tests/slices/slices.gs.js +0 -294
  162. package/dist/compliance/tests/slices/slices.gs.js.map +0 -1
  163. package/dist/compliance/tests/string_conversion/string_conversion.gs.d.ts +0 -1
  164. package/dist/compliance/tests/string_conversion/string_conversion.gs.js +0 -41
  165. package/dist/compliance/tests/string_conversion/string_conversion.gs.js.map +0 -1
  166. package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.d.ts +0 -1
  167. package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.js +0 -17
  168. package/dist/compliance/tests/string_rune_conversion/string_rune_conversion.gs.js.map +0 -1
  169. package/dist/compliance/tests/struct_embedding/struct_embedding.gs.d.ts +0 -1
  170. package/dist/compliance/tests/struct_embedding/struct_embedding.gs.js +0 -48
  171. package/dist/compliance/tests/struct_embedding/struct_embedding.gs.js.map +0 -1
  172. package/dist/compliance/tests/struct_field_access/struct_field_access.gs.d.ts +0 -1
  173. package/dist/compliance/tests/struct_field_access/struct_field_access.gs.js +0 -19
  174. package/dist/compliance/tests/struct_field_access/struct_field_access.gs.js.map +0 -1
  175. package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.d.ts +0 -1
  176. package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.js +0 -26
  177. package/dist/compliance/tests/struct_pointer_interface_fields/struct_pointer_interface_fields.gs.js.map +0 -1
  178. package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.d.ts +0 -1
  179. package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.js +0 -30
  180. package/dist/compliance/tests/struct_value_init_clone/struct_value_init_clone.gs.js.map +0 -1
  181. package/dist/compliance/tests/switch_statement/switch_statement.gs.d.ts +0 -1
  182. package/dist/compliance/tests/switch_statement/switch_statement.gs.js +0 -76
  183. package/dist/compliance/tests/switch_statement/switch_statement.gs.js.map +0 -1
  184. package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.d.ts +0 -1
  185. package/dist/compliance/tests/value_type_copy_behavior/value_type_copy_behavior.gs.js +0 -31
  186. 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) 2019-2024 Christian Stewart
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/paralin/goscript
6
- [GoDoc Widget]: https://godoc.org/github.com/paralin/goscript?status.svg
7
- [Go Report Card Widget]: https://goreportcard.com/badge/github.com/paralin/goscript
8
- [Go Report Card]: https://goreportcard.com/report/github.com/paralin/goscript
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
- "context"
64
- "log"
67
+ "context"
68
+ "log"
65
69
 
66
- "github.com/paralin/goscript/compiler"
67
- "github.com/sirupsen/logrus"
70
+ "github.com/aperturerobotics/goscript/compiler"
71
+ "github.com/sirupsen/logrus"
68
72
  )
69
73
 
70
74
  func main() {
71
- // Initialize logger (optional)
72
- logger := logrus.New()
73
- logger.SetLevel(logrus.DebugLevel) // Adjust log level as needed
74
- le := logrus.NewEntry(logger)
75
-
76
- // Configure the compiler
77
- conf := &compiler.Config{
78
- OutputPathRoot: "./ts_output", // Directory for generated TypeScript files
79
- }
80
- if err := conf.Validate(); err != nil {
81
- log.Fatalf("invalid compiler config: %v", err)
82
- }
83
-
84
- // Create a new compiler instance
85
- comp, err := compiler.NewCompiler(conf, le, nil) // Pass nil for default package loading options
86
- if err != nil {
87
- log.Fatalf("failed to create compiler: %v", err)
88
- }
89
-
90
- // Compile the desired Go package(s)
91
- // Replace "." with the specific Go import path of the package you want to compile
92
- if err := comp.CompilePackages(context.Background(), "your/go/package/path"); err != nil {
93
- log.Fatalf("compilation failed: %v", err)
94
- }
95
-
96
- log.Println("Compilation successful!")
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 range loop
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 goscript from "@goscript/builtin"
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 = goscript.makeChannel<string>(0)
526
+ let ch = $.makeChannel<string>(0, "")
444
527
  queueMicrotask(async () => {
445
- console.log("Goroutine: Sending message")
446
- await ch.send("Hello from goroutine!")
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