-
-
Save ashumeow/fe5cb10d74b1a054a003 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
output: html_document | |
--- | |
```{r setup, echo=FALSE} | |
library(knitr) | |
eng_go <- function(options) { | |
# create a temporary file | |
f <- basename(tempfile("go", '.', paste('.', "go", sep = ''))) | |
on.exit(unlink(f)) # cleanup temp file on function exit | |
writeLines(options$code, f) | |
out <- '' | |
# if eval != FALSE compile/run the code, preserving output | |
if (options$eval) { | |
out <- system(sprintf('go run %s', paste(f, options$engine.opts)), intern=TRUE) | |
} | |
# spit back stuff to the user | |
engine_output(options, options$code, out) | |
} | |
knitr::knit_engines$set(go=eng_go) | |
``` | |
```{r go-ex, engine='go', eval=TRUE} | |
package main | |
import "fmt" | |
func main() { | |
// Unlike arrays, slices are typed only by the | |
// elements they contain (not the number of elements). | |
// To create an empty slice with non-zero length, use | |
// the builtin `make`. Here we make a slice of | |
// `string`s of length `3` (initially zero-valued). | |
s := make([]string, 3) | |
fmt.Println("emp:", s) | |
// We can set and get just like with arrays. | |
s[0] = "a" | |
s[1] = "b" | |
s[2] = "c" | |
fmt.Println("set:", s) | |
fmt.Println("get:", s[2]) | |
// `len` returns the length of the slice as expected. | |
fmt.Println("len:", len(s)) | |
// In addition to these basic operations, slices | |
// support several more that make them richer than | |
// arrays. One is the builtin `append`, which | |
// returns a slice containing one or more new values. | |
// Note that we need to accept a return value from | |
// append as we may get a new slice value. | |
s = append(s, "d") | |
s = append(s, "e", "f") | |
fmt.Println("apd:", s) | |
// Slices can also be copied. Here we create an | |
// empty slice `c` of the same length as `s` and copy | |
// into `c` from `s`. | |
c := make([]string, len(s)) | |
copy(c, s) | |
fmt.Println("cpy:", c) | |
// Slices support a "slice" operator with the syntax | |
// `slice[low:high]`. For example, this gets a slice | |
// of the elements `s[2]`, `s[3]`, and `s[4]`. | |
l := s[2:5] | |
fmt.Println("sl1:", l) | |
// This slices up to (but excluding) `s[5]`. | |
l = s[:5] | |
fmt.Println("sl2:", l) | |
// And this slices up from (and including) `s[2]`. | |
l = s[2:] | |
fmt.Println("sl3:", l) | |
// We can declare and initialize a variable for slice | |
// in a single line as well. | |
t := []string{"g", "h", "i"} | |
fmt.Println("dcl:", t) | |
// Slices can be composed into multi-dimensional data | |
// structures. The length of the inner slices can | |
// vary, unlike with multi-dimensional arrays. | |
twoD := make([][]int, 3) | |
for i := 0; i < 3; i++ { | |
innerLen := i + 1 | |
twoD[i] = make([]int, innerLen) | |
for j := 0; j < innerLen; j++ { | |
twoD[i][j] = i + j | |
} | |
} | |
fmt.Println("2d: ", twoD) | |
} | |
``` | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment