A-D
package mainimport "fmt"func main() { //创建int型数组a,大小为5,数组内默认值为0 var a [5]int fmt.Println("emp:", a) //对int数组a的索引为4的元素赋值为100 a[4] = 100 fmt.Println("set:", a) fmt.Println("get:", a[4]) //判定长度 fmt.Println("len:", len(a)) //采用短变量声明一个int数组b,并指定相应位置的值 b := [5]int{1, 2, 3, 4, 5} fmt.Println("dcl:", b) //与b的创建一样,初始为空数组,大小5 c := [5]int{} fmt.Println("c:", c) //创建二维数组 默认为空 var twoD [2][3]int for i := 0; i < 2; i++ { for j := 0; j < 3; j++ { twoD[i][j] = i + j } } fmt.Println("2d: ", twoD)}
package mainimport ( "fmt" "sync" "sync/atomic")func main() { var ops uint64 var wg sync.WaitGroup for i := 0; i < 50; i++ { wg.Add(1) go func() { for c := 0; c < 1000; c++ { atomic.AddUint64(&ops, 1) } wg.Done() }() } wg.Wait() fmt.Println("ops:", ops)}
package mainimport ( b64 "encoding/base64" "fmt")func main() { data := "abc123!?$*&()'-=@~" //对字符串进行 sEnc := b64.StdEncoding.EncodeToString([]byte(data)) fmt.Println(sEnc) sDec, _ := b64.StdEncoding.DecodeString(sEnc) fmt.Println(string(sDec)) fmt.Println() uEnc := b64.URLEncoding.EncodeToString([]byte(data)) fmt.Println(uEnc) uDec, _ := b64.URLEncoding.DecodeString(uEnc) fmt.Println(string(uDec))}
package mainimport "fmt"func main() { messages := make(chan string, 2) messages <- "buffered" messages <- "channel" fmt.Println(<-messages) fmt.Println(<-messages)}
package mainimport "fmt"func ping(pings chan<- string, msg string) { pings <- msg}func pong(pings <-chan string, pongs chan<- string) { msg := <-pings pongs <- msg}func main() { pings := make(chan string, 1) pongs := make(chan string, 1) ping(pings, "passed message") pong(pings, pongs) fmt.Println(<-pongs)}
package mainimport ( "fmt" "time")func worker1(done chan bool) { fmt.Print("working...") time.Sleep(time.Second) fmt.Println("done") done <- true}func main() { done := make(chan bool, 1) go worker1(done) //<-done}
package mainimport "fmt"func main() { //通道(channels) 是连接多个协程的管道。 你可以从一个协程将值发送到通道,然后在另一个协程中接收。 //使用 make(chan val-type) 创建一个新的通道 messages := make(chan string) //channel(messages) <- string 发送一个值到通道中 go func() { messages <- "ping" }() //从通道中 接收一个值 //变量 := <-channel msg := <-messages fmt.Println(msg)}
package mainimport "fmt"func main() { jobs := make(chan int, 5) done := make(chan bool) go func() { for { j, more := <-jobs if more { fmt.Println("received job", j) } else { fmt.Println("received all jobs") done <- true return } } }() for j := 1; j <= 3; j++ { jobs <- j fmt.Println("sent job", j) } close(jobs) fmt.Println("sent all jobs") <-done}
package mainimport "fmt"func intSeq() func() int { //函数式编程,可以参考《计算机程序构造与解释》一书(Lisp) i := 0 //----1 return func() int { i++ //----2 return i //----3 }}func main() { nextInt := intSeq() fmt.Println(nextInt()) fmt.Println(nextInt()) fmt.Println(nextInt()) newInts := intSeq() fmt.Println(newInts())}
package mainimport ( "fmt" "os")func main() { argsWithProg := os.Args argsWithoutProg := os.Args[1:] arg := os.Args[3] fmt.Println(argsWithProg) fmt.Println(argsWithoutProg) fmt.Println(arg)}
package mainimport ( "flag" "fmt")func main() { wordPtr := flag.String("word", "foo", "a string") numbPtr := flag.Int("numb", 42, "an int") forkPtr := flag.Bool("fork", false, "a bool") var svar string flag.StringVar(&svar, "svar", "bar", "a string var") flag.Parse() fmt.Println("word:", *wordPtr) fmt.Println("numb:", *numbPtr) fmt.Println("fork:", *forkPtr) fmt.Println("svar:", svar) fmt.Println("tail:", flag.Args())}
package mainimport ( "flag" "fmt" "os")func main() { fooCmd := flag.NewFlagSet("foo", flag.ExitOnError) fooEnable := fooCmd.Bool("enable", false, "enable") fooName := fooCmd.String("name", "", "name") barCmd := flag.NewFlagSet("bar", flag.ExitOnError) barLevel := barCmd.Int("level", 0, "level") if len(os.Args) < 2 { fmt.Println("expected 'foo' or 'bar' subcommands") os.Exit(1) } switch os.Args[1] { case "foo": fooCmd.Parse(os.Args[2:]) fmt.Println("subcommand 'foo'") fmt.Println(" enable:", *fooEnable) fmt.Println(" name:", *fooName) fmt.Println(" tail:", fooCmd.Args()) case "bar": barCmd.Parse(os.Args[2:]) fmt.Println("subcommand 'bar'") fmt.Println(" level:", *barLevel) fmt.Println(" tail:", barCmd.Args()) default: fmt.Println("expected 'foo' or 'bar' subcommands") os.Exit(1) }}
package mainimport ( "fmt" "math")const s string = "constant"//常量不允许修改func main() { fmt.Println(s) const n = 500000000 //5*10^8 const d = 3e20 / n //3*10^20 fmt.Println(d) //0.6*10^12 = 6 * 10^11 fmt.Println(int64(d)) //math.sin需要float64 n会自动确认类型 fmt.Println(math.Sin(n))}
package mainimport ( "fmt" "net/http" "time")func hello1(w http.ResponseWriter, req *http.Request) { ctx := req.Context() fmt.Println("server: hello handler started") defer fmt.Println("server: hello handler ended") select { case <-time.After(10 * time.Second): fmt.Fprintf(w, "hello\n") case <-ctx.Done(): err := ctx.Err() fmt.Println("server:", err) internalError := http.StatusInternalServerError http.Error(w, err.Error(), internalError) }}func main() { http.HandleFunc("/hello", hello) http.ListenAndServe(":8090", nil)}
package mainimport ( "fmt" "os")func main() { f := createFile("/tmp/defer.txt") defer closeFile(f) writeFile(f)}func createFile(p string) *os.File { fmt.Println("creating") f, err := os.Create(p) if err != nil { panic(err) } return f}func writeFile(f *os.File) { fmt.Println("writing") fmt.Fprintln(f, "data")}func closeFile(f *os.File) { fmt.Println("closing") err := f.Close() if err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) }}
package mainimport ( "fmt" "os" "path/filepath")func check2(e error) { if e != nil { panic(e) }}func main() { err := os.Mkdir("subdir", 0755) check2(err) defer os.RemoveAll("subdir") createEmptyFile := func(name string) { d := []byte("") check2(os.WriteFile(name, d, 0644)) } createEmptyFile("subdir/file1") err = os.MkdirAll("subdir/parent/child", 0755) check2(err) createEmptyFile("subdir/parent/file2") createEmptyFile("subdir/parent/file3") createEmptyFile("subdir/parent/child/file4") c, err := os.ReadDir("subdir/parent") check2(err) fmt.Println("Listing subdir/parent") for _, entry := range c { fmt.Println(" ", entry.Name(), entry.IsDir()) } err = os.Chdir("subdir/parent/child") check2(err) c, err = os.ReadDir(".") check2(err) fmt.Println("Listing subdir/parent/child") for _, entry := range c { fmt.Println(" ", entry.Name(), entry.IsDir()) } err = os.Chdir("../../..") check2(err) fmt.Println("Visiting subdir") err = filepath.Walk("subdir", visit)}func visit(p string, info os.FileInfo, err error) error { if err != nil { return err } fmt.Println(" ", p, info.IsDir()) return nil}
E-H
package mainimport "fmt"//创建base结构体type base struct { age int num int}//(参数列表):b base (返回值类型)describe() stringfunc (b base) describe() string { return fmt.Sprintf("base with num=%v", b.num)}//创建container结构体,包含base?type container struct { base str string}func main() { //co 是container的一个对象 co := container{ //必须对base进行显示初始化 base: base{ num: 1, }, str: "some name", } fmt.Printf("co={num: %v, str: %v}\n", co.num, co.str) fmt.Println("also num:", co.base.num) //co(container)->base str->base.describe //两种访问方法均可 //fmt.Println("describe:", co.base.describe()) --1 fmt.Println("describe:", co.describe()) //--2 //创建一个describer接口 访问describe方法 type describer interface { describe() string } var d describer = co fmt.Println("describer:", d.describe())}// Circle ----------------------------//比如说,在2D绘图程序当中,我们可能会定义以下两个结构类型//圆圈/*type Circle struct { X, Y, Radius int}//Wheel 车轮type Wheel struct { X, Y, Radius, Spokes int}func main() { var w Wheel w.X = 8 w.Y = 8 w.Radius = 5 w.Spokes = 20}*///--------------------------------------//但是当支持的形状变多了之后 我们需要重构相同的部分//--------------------------------------/*type Point struct { X,Y int}type Circle struct { Center Point Radius int}type Wheel struct { Circle Circle Spokes int}func main() { var w Wheel w.Circle.Center.X = 8 w.Circle.Center.Y = 8 w.Circle.Radius = 5 w.Spokes = 20}*///程序结构简单了,但是访问wheel成员变得麻烦了//----------------------------//结构体嵌套和匿名成员的引入//匿名成员:Go允许我们定义不带名称的结构体成员,只需要指定类型即可;//这种结构体成员称作匿名成员。这个结构体成员的类型必须是一个命名类型//或者指向命名类型的指针/*type Point struct { X,Y int}type Circle struct { Point Radius int}type Wheel struct { Circle Spokes int}func main() { var w Wheel w.X = 8 w.Y = 8 w.Radius = 5 w.Spokes = 20}*/
package mainimport ( "fmt" "os" "strings")func main() { os.Setenv("FOO", "1") fmt.Println("FOO:", os.Getenv("FOO")) fmt.Println("BAR:", os.Getenv("BAR")) fmt.Println() for _, e := range os.Environ() { pair := strings.SplitN(e, "=", 2) fmt.Println(pair[0]) }}
package mainimport ( "fmt" "time")func main() { now := time.Now() secs := now.Unix() nanos := now.UnixNano() fmt.Println(now) millis := nanos / 1000000 fmt.Println(secs) fmt.Println(millis) fmt.Println(nanos) fmt.Println(time.Unix(secs, 0)) fmt.Println(time.Unix(0, nanos))}
package mainimport ( "errors" "fmt")//参数arg 返回int error两个参数func f1(arg int) (int, error) { //若arg==42 if arg == 42 { //返回int=-1 error 错误信息 can't work with 42 return -1, errors.New("can't work with 42") } //若不是则返回arg+3 , nil return arg + 3, nil}//定义argError结构体type argError struct { arg int prob string}func (e *argError) Error() string { return fmt.Sprintf("%d - %s", e.arg, e.prob)}func f2(arg int) (int, error) { if arg == 42 { return -1, &argError{arg, "can't work with it"} } return arg + 3, nil}func main() { //遍历{7,42}这个切片,空白化(索引值index)(key)值为_,value值为i。 for _, i := range []int{7, 42} { //第一遍 //i=7, r,e传入f1中的int error两个参数,当e 不为nil时 //转到f1判断,因为i->arg=7 != 42 ->return arg+3,nil ->r=10,e=nil //不满足if条件 走else分支 //第二遍 //i=42,其他同上,向f1方法传入i=42的值->return -1,errors.New(can't work with 42) //满足if条件。打印f1 failed:can't work with 42------------------② if r, e := f1(i); e != nil { fmt.Println("f1 failed:", e) } else { fmt.Println("f1 worked:", r) //打印 f1 worked: 10 ------① } } //第一遍同上 //第二遍 return -1, &argError{arg, "can't work with it"} for _, i := range []int{7, 42} { if r, e := f2(i); e != nil { fmt.Println("f2 failed:", e) //打印 f2 failed: 42 - can't work with it----④ } else { fmt.Println("f2 worked:", r) //打印 f2 worked: 10 ------③ } } //e接收f2返回的信息 &argError{arg, "can't work with it"} _, e := f2(42) //ar ok 分别接收e的arg 和 字符串;当ok也就是字符串不为空时 if ae, ok := e.(*argError); ok { //打印两条语句 fmt.Println(ae.arg) fmt.Println(ae.prob) }}
package mainimport ( "os" "os/exec" "syscall")func main() { binary, lookErr := exec.LookPath("ls") if lookErr != nil { panic(lookErr) } args := []string{"ls", "-a", "-l", "-h"} env := os.Environ() //execErr := syscall.Exec(binary, args, env) if execErr != nil { panic(execErr) }}
package mainimport ( "fmt" "os" "strings")func main() { // ! 不会被打印出来 defer fmt.Println("!") os.Exit(3)}func twoSum(nums []int, target int) []int { //1.暴力解法 // for i:=0;i<len(nums);i++{ // for j := 0;j<len(nums);j++{ // if nums[i]+nums[j] == target && i!= j{ // return []int{i,j} // } // } // } // return nil //2.哈希表 m := map[int]int{} for i := 0; i < len(nums); i++ { other := target - nums[i] if p, ok := m[other]; ok { return []int{p, i} } m[nums[i]] = i } return nil}func isPalindrome(s string) bool { q, p := 0, len(s)-1 s = strings.ToUpper(s) for q <= p { //确保左右两边都是有效字符 if !ischar(s[q]) { q++ } else if !ischar(s[p]) { p-- } else if s[q] != s[p] { return false } //是字符,正常左右两边走 q++ p-- } return true}func ischar(ch byte) bool { return (ch <= 'Z' && ch >= 'A') || (ch >= '0' && ch <= '9')}
package mainimport ( "fmt" "path/filepath" "strings")func main() { p := filepath.Join("dir1", "dir2", "filename") fmt.Println("p:", p) fmt.Println(filepath.Join("dir1//", "filename")) fmt.Println(filepath.Join("dir1/../dir1", "filename")) fmt.Println("Dir(p):", filepath.Dir(p)) fmt.Println("Base(p):", filepath.Base(p)) fmt.Println(filepath.IsAbs("dir/file")) fmt.Println(filepath.IsAbs("/dir/file")) filename := "config.json" ext := filepath.Ext(filename) fmt.Println(ext) fmt.Println(strings.TrimSuffix(filename, ext)) rel, err := filepath.Rel("a/b", "a/b/t/file") if err != nil { panic(err) } fmt.Println(rel) rel, err = filepath.Rel("a/b", "a/c/t/file") if err != nil { panic(err) } fmt.Println(rel)}
package mainimport "fmt"func main() { //1-3 i := 1 for i <= 3 { fmt.Println(i) i = i + 1 } //7-9 for j := 7; j <= 9; j++ { fmt.Println(j) } //loop 相当于 while(true){break} for { fmt.Println("loop") break } //打印奇数(0-5之间) for n := 0; n <= 5; n++ { if n%2 == 0 { continue } fmt.Println(n) }}
package mainimport "fmt"func plus(a int, b int) int { return a + b}func plusPlus(a, b, c int) int { return a + b + c}func main() { res := plus(1, 2) fmt.Println("1+2 =", res) res = plusPlus(1, 2, 3) fmt.Println("1+2+3 =", res)}
package mainimport "fmt"// MapKeys 泛型:类型参数// -----------------------------------------------------------------// type comparable interface{ comparable }// comparable是一个由所有可比较类型实现的接口// (布尔值、数字、字符串、指针、通道、可比类型数组、结构的字段都是可比较的类型)。// 可比接口只能作为类型参数约束使用,不是变量的类型。// -----------------------------------------------------------------// type any = interface{}// any是接口{}的别名,在所有方面都等价于接口{}。func MapKeys[K comparable, V any](m map[K]V) []K { //属实没看懂... r := make([]K, 0, len(m)) for k := range m { r = append(r, k) } return r}type List[T any] struct { head, tail *element[T]}type element[T any] struct { next *element[T] val T}func (lst *List[T]) Push(v T) { if lst.tail == nil { lst.head = &element[T]{val: v} lst.tail = lst.head } else { lst.tail.next = &element[T]{val: v} lst.tail = lst.tail.next }}func (lst *List[T]) GetAll() []T { var elems []T for e := lst.head; e != nil; e = e.next { elems = append(elems, e.val) } return elems}func main() { //创建一个map key(int)-value(string) 并赋初值 var m = map[int]string{1: "2", 2: "4", 4: "8"} //打印keys值 1 2 4 fmt.Println("keys m:", MapKeys(m)) _ = MapKeys[int, string](m) lst := List[int]{} lst.Push(10) lst.Push(13) lst.Push(23) fmt.Println("list:", lst.GetAll())}
package mainimport ( "fmt" "time")func f(from string) { for i := 0; i < 10; i++ { //解锁fmt.Println用法 //func Println(a ...any) (n int, err error) { // return Fprintln(os.Stdout, a...) //} fmt.Println(from, ":", i) }}func main() { //并发执行direct 和 goroutine //异步进行 f("direct") //go f(s) 在一个协程中调用这个函数。 这个新的 Go 协程将会 并发地 执行这个函数。 go f("goroutine") //going的位置会不确定 go func(msg string) { fmt.Println(msg) }("going") time.Sleep(time.Second) fmt.Println("done")}
package mainimport ( "bufio" "fmt" "net/http")func main() { resp, err := http.Get("http://gobyexample.com") if err != nil { panic(err) } defer resp.Body.Close() fmt.Println("Response status:", resp.Status) scanner := bufio.NewScanner(resp.Body) for i := 0; scanner.Scan() && i < 5; i++ { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { panic(err) }}
package mainimport ( "fmt" "net/http")func hello(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "hello\n")}func headers(w http.ResponseWriter, req *http.Request) { for name, headers := range req.Header { for _, h := range headers { fmt.Fprintf(w, "%v: %v\n", name, h) } }}func main() { http.HandleFunc("/hello", hello) http.HandleFunc("/headers", headers) http.ListenAndServe(":8090", nil)}
I-L
package mainimport "fmt"func main() { //判断奇偶 if 7%2 == 0 { fmt.Println("7 is even") //偶数 } else { fmt.Println("7 is odd") //奇数 } //能否整除 if 8%4 == 0 { fmt.Println("8 is divisible by 4") } //判断数是一位数还是多位数(0-∞),其余输出负数 //注: C/C++ Java 都有的三元运算符,在Go中并没有 //圆括号可以省略不写(推荐不写) {}是必需的 if num := 9; num < 0 { fmt.Println(num, "is negative") } else if num < 10 { fmt.Println(num, "has 1 digit") } else { fmt.Println(num, "has multiple digits") }}
package mainimport ( "fmt" "math")//接口对area perim 两种方法进行了再次抽象type geometry interface { area() float64 perim() float64}type rect struct { width, height float64}type circle struct { radius float64}func (r rect) area() float64 { return r.width * r.height}func (r rect) perim() float64 { return 2*r.width + 2*r.height}func (c circle) area() float64 { return math.Pi * c.radius * c.radius}func (c circle) perim() float64 { return 2 * math.Pi * c.radius}//geometry:几何体func measure(g geometry) { //输出自身: {3 4}、 {5} fmt.Println(g) //输出面积/周长 fmt.Println(g.area()) fmt.Println(g.perim())}func main() { //创建r(rest)结构体 宽3高4 r := rect{width: 3, height: 4} //创建⚪(circle) 半径5 c := circle{radius: 5} measure(r) measure(c)}
package mainimport ( "encoding/json" "fmt" "os")type response1 struct { Page int Fruits []string}type response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"`}func main() { bolB, _ := json.Marshal(true) fmt.Println(string(bolB)) intB, _ := json.Marshal(1) fmt.Println(string(intB)) fltB, _ := json.Marshal(2.34) fmt.Println(string(fltB)) strB, _ := json.Marshal("gopher") fmt.Println(string(strB)) slcD := []string{"apple", "peach", "pear"} slcB, _ := json.Marshal(slcD) fmt.Println(string(slcB)) mapD := map[string]int{"apple": 5, "lettuce": 7} mapB, _ := json.Marshal(mapD) fmt.Println(string(mapB)) res1D := &response1{ Page: 1, Fruits: []string{"apple", "peach", "pear"}} res1B, _ := json.Marshal(res1D) fmt.Println(string(res1B)) res2D := &response2{ Page: 1, Fruits: []string{"apple", "peach", "pear"}} res2B, _ := json.Marshal(res2D) fmt.Println(string(res2B)) byt := []byte(`{"num":6.13,"strs":["a","b"]}`) var dat map[string]interface{} if err := json.Unmarshal(byt, &dat); err != nil { panic(err) } fmt.Println(dat) num := dat["num"].(float64) fmt.Println(num) strs := dat["strs"].([]interface{}) str1 := strs[0].(string) fmt.Println(str1) str := `{"page": 1, "fruits": ["apple", "peach"]}` res := response2{} json.Unmarshal([]byte(str), &res) fmt.Println(res) fmt.Println(res.Fruits[0]) enc := json.NewEncoder(os.Stdout) d := map[string]int{"apple": 5, "lettuce": 7} enc.Encode(d)}
package mainimport ( "bufio" "fmt" "os" "strings")func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { ucl := strings.ToUpper(scanner.Text()) fmt.Println(ucl) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "error:", err) os.Exit(1) }}
M-P
package mainimport "fmt"func main() { fmt.Println("hello world")}
package mainimport "fmt"func main() { m := make(map[string]int) //建立map key-value类型 key:string value:int m["k1"] = 7 m["k2"] = 13 fmt.Println("map:", m) v1 := m["k1"] fmt.Println("v1: ", v1) fmt.Println("len:", len(m)) //2 //删除key 为 k2的键 delete(m, "k2") fmt.Println("map:", m) //面对不需要的值用 _ 空白标识符 _, prs := m["k2"] fmt.Println("prs:", prs) //false n := map[string]int{"foo": 1, "bar": 2} fmt.Println("map:", n)}
package mainimport "fmt"type rect1 struct { width, height int}//method1func (r *rect1) area() int { return r.width * r.height}//method2func (r rect1) perim() int { return 2*r.width + 2*r.height}func main() { //rect是矩形 //创建结构体r(rect)并赋默认值 r := rect{width: 10, height: 5} //使用m1计算面积 fmt.Println("area: ", r.area()) //使用m1计算周长 fmt.Println("perim:", r.perim()) //通过使用指针来避免拷贝(浪费空间) rp := &r fmt.Println("area: ", rp.area()) fmt.Println("perim:", rp.perim())}
package mainimport "fmt"func vals() (int, int) { return 3, 7}func main() { //支持多返回值 a, b := vals() fmt.Println(a) fmt.Println(b) _, c := vals() fmt.Println(c)}
package mainimport ( "fmt" "sync")type Container struct { mu sync.Mutex counters map[string]int}func (c *Container) inc(name string) { c.mu.Lock() defer c.mu.Unlock() c.counters[name]++}func main() { c := Container{ counters: map[string]int{"a": 0, "b": 0}, } var wg sync.WaitGroup doIncrement := func(name string, n int) { for i := 0; i < n; i++ { c.inc(name) } wg.Done() } wg.Add(3) go doIncrement("a", 10000) go doIncrement("a", 10000) go doIncrement("b", 10000) wg.Wait() fmt.Println(c.counters)}
package mainimport "fmt"func main() { messages := make(chan string) signals := make(chan bool) select { case msg := <-messages: fmt.Println("received message", msg) default: fmt.Println("no message received") } msg := "hi" select { case messages <- msg: fmt.Println("sent message", msg) default: fmt.Println("no message sent") } select { case msg := <-messages: fmt.Println("received message", msg) case sig := <-signals: fmt.Println("received signal", sig) default: fmt.Println("no activity") }}
package mainimport ( "fmt" "strconv")func main() { f, _ := strconv.ParseFloat("1.234", 64) fmt.Println(f) i, _ := strconv.ParseInt("123", 0, 64) fmt.Println(i) d, _ := strconv.ParseInt("0x1c8", 0, 64) fmt.Println(d) u, _ := strconv.ParseUint("789", 0, 64) fmt.Println(u) k, _ := strconv.Atoi("135") fmt.Println(k) _, e := strconv.Atoi("wat") fmt.Println(e)}
package mainimport "os"func main() { panic("a problem") _, err := os.Create("/tmp/file") if err != nil { panic(err) }}
package mainimport "fmt"//值传递func zeroval(ival int) { ival = 0}//“引用”传递 ->本质还是值传递,只不过值变成了指针所指的逻辑地址func zeroptr(iptr *int) { *iptr = 0}func main() { i := 1 fmt.Println("initial:", i) zeroval(i) fmt.Println("zeroval:", i) zeroptr(&i) fmt.Println("zeroptr:", i) //打印i所在的逻辑地址(每个人机器打出来的值都会有所不同,由OS分配) //fmt.Println(&i) 0xc000016098 fmt.Println("pointer:", &i)}
R-S
package mainimport ( "fmt" "math/rand" "time")func main() { //生成随机数0-100 fmt.Print(rand.Intn(100), ",") fmt.Print(rand.Intn(100)) fmt.Println() //生成随机float64位浮点数(0.0-1.0) fmt.Println(rand.Float64()) //5.0-10.0 fmt.Print((rand.Float64()*5)+5, ",") fmt.Print((rand.Float64() * 5) + 5) fmt.Println() s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1) fmt.Print(r1.Intn(100), ",") fmt.Print(r1.Intn(100)) fmt.Println() //使用相同种子生成的随机数生成器,会生成相同的随机数序列 s2 := rand.NewSource(42) r2 := rand.New(s2) //此处① fmt.Print(r2.Intn(100), ",") fmt.Print(r2.Intn(100)) fmt.Println() s3 := rand.NewSource(42) r3 := rand.New(s3) //此处②同①生成相同的两个随机数 fmt.Print(r3.Intn(100), ",") fmt.Print(r3.Intn(100))}
package mainimport "fmt"func main() { //创建切片nums len = 3 nums := []int{2, 3, 4} sum := 0 //对nums中的数据求和,存放在num中 for _, num := range nums { sum += num } fmt.Println("sum:", sum) //取出num ==3时,对应的索引值 for i, num := range nums { if num == 3 { fmt.Println("index:", i) } } //创建key-value的map kvs := map[string]string{"a": "apple", "b": "banana", "p": "peach"} //随机取值 map无序 for k, v := range kvs { fmt.Printf("%s -> %s\n", k, v) } for k := range kvs { fmt.Println("key:", k) } for i, c := range "go" { //字符串 输出索引值 0 1 和其对应的ascii码值 fmt.Println(i, c) //Output: //0 103 //1 111 }}
package mainimport "fmt"func main() { queue := make(chan string, 2) queue <- "one" queue <- "two" close(queue) for elem := range queue { fmt.Println(elem) }}
package mainimport ( "fmt" "time")func main() { requests := make(chan int, 5) for i := 1; i <= 5; i++ { requests <- i } close(requests) limiter := time.Tick(200 * time.Millisecond) for req := range requests { <-limiter fmt.Println("request", req, time.Now()) } burstyLimiter := make(chan time.Time, 3) for i := 0; i < 3; i++ { burstyLimiter <- time.Now() } go func() { for t := range time.Tick(200 * time.Millisecond) { burstyLimiter <- t } }() burstyRequests := make(chan int, 5) for i := 1; i <= 5; i++ { burstyRequests <- i } close(burstyRequests) for req := range burstyRequests { <-burstyLimiter fmt.Println("request", req, time.Now()) }}
package mainimport ( "bufio" "fmt" "io" "os")func check(e error) { if e != nil { panic(e) }}func main() { dat, err := os.ReadFile("/tmp/dat") check(err) fmt.Print(string(dat)) f, err := os.Open("/tmp/dat") check(err) b1 := make([]byte, 5) n1, err := f.Read(b1) check(err) fmt.Printf("%d bytes: %s\n", n1, string(b1[:n1])) o2, err := f.Seek(6, 0) check(err) b2 := make([]byte, 2) n2, err := f.Read(b2) check(err) fmt.Printf("%d bytes @ %d: ", n2, o2) fmt.Printf("%v\n", string(b2[:n2])) o3, err := f.Seek(6, 0) check(err) b3 := make([]byte, 2) n3, err := io.ReadAtLeast(f, b3, 2) check(err) fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3)) _, err = f.Seek(0, 0) check(err) r4 := bufio.NewReader(f) b4, err := r4.Peek(5) check(err) fmt.Printf("5 bytes: %s\n", string(b4)) f.Close()}
package mainimport "fmt"func mayPanic() { panic("a problem")}func main() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered. Error:\n", r) } }() mayPanic() fmt.Println("After mayPanic()")}
package mainimport "fmt"func fact(n int) int { if n == 0 { return 1 } return n * fact(n-1)}func main() { //计算7的阶乘 fmt.Println(fact(7)) //1 2 6 24 120 720 5040... var fib func(n int) int //计算斐波那契数列 fib = func(n int) int { if n < 2 { return n } return fib(n-1) + fib(n-2) } //1 1 2 3 5 8 13... fmt.Println(fib(7))}
package mainimport ( "bytes" "fmt" "regexp")func main() { match, _ := regexp.MatchString("p([a-z]+)ch", "peach") fmt.Println(match) r, _ := regexp.Compile("p([a-z]+)ch") fmt.Println(r.MatchString("peach")) fmt.Println(r.FindString("peach punch")) fmt.Println("idx:", r.FindStringIndex("peach punch")) fmt.Println(r.FindStringSubmatch("peach punch")) fmt.Println(r.FindStringSubmatchIndex("peach punch")) fmt.Println(r.FindAllString("peach punch pinch", -1)) fmt.Println("all:", r.FindAllStringSubmatchIndex( "peach punch pinch", -1)) fmt.Println(r.FindAllString("peach punch pinch", 2)) fmt.Println(r.Match([]byte("peach"))) r = regexp.MustCompile("p([a-z]+)ch") fmt.Println("regexp:", r) fmt.Println(r.ReplaceAllString("a peach", "<fruit>")) in := []byte("a peach") out := r.ReplaceAllFunc(in, bytes.ToUpper) fmt.Println(string(out))}
package mainimport ( "fmt" "time")func main() { c1 := make(chan string) c2 := make(chan string) go func() { time.Sleep(1 * time.Second) c1 <- "one" }() go func() { time.Sleep(2 * time.Second) c2 <- "two" }() for i := 0; i < 2; i++ { select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } }}
package mainimport ( "crypto/sha256" "fmt")func main() { s := "sha256 this string" h := sha256.New() h.Write([]byte(s)) bs := h.Sum(nil) fmt.Println(s) fmt.Printf("%x\n", bs)}
package mainimport ( "fmt" "os" "os/signal" "syscall")func main() { sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) done := make(chan bool, 1) go func() { sig := <-sigs fmt.Println() fmt.Println(sig) done <- true }() fmt.Println("awaiting signal") <-done fmt.Println("exiting")}
package mainimport "fmt"func main() { //创建切片,默认值为空字符串 "" s := make([]string, 3) fmt.Println("emp:", s) //对s切片赋值a b c s[0] = "a" s[1] = "b" s[2] = "c" fmt.Println("set:", s) fmt.Println("get:", s[2]) //获取长度 fmt.Println("len:", len(s)) //向s中追加 "d" s = append(s, "d") //slice 扩容可查看src/runtime/slice.go 下的 growslice 函数 s = append(s, "e", "f") fmt.Println("apd:", s) //创建与c同样大小的c slice c := make([]string, len(s)) //切片复制 copy(c, s) fmt.Println("cpy:", c) //左取右不取 l := s[2:5] fmt.Println("sl1:", l) l = s[:5] fmt.Println("sl2:", l) l = s[2:] fmt.Println("sl3:", l) t := []string{"g", "h", "i"} fmt.Println("dcl:", t) //二维切片 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) //OutPut: [[0] [1 2] [2 3 4]]}
package mainimport ( "fmt" "sort")func main() { strs := []string{"c", "a", "b"} sort.Strings(strs) fmt.Println("Strings:", strs) ints := []int{7, 2, 4} sort.Ints(ints) fmt.Println("Ints: ", ints) s := sort.IntsAreSorted(ints) fmt.Println("Sorted: ", s)}
package mainimport ( "fmt" "sort")type byLength []stringfunc (s byLength) Len() int { return len(s)}func (s byLength) Swap(i, j int) { s[i], s[j] = s[j], s[i]}func (s byLength) Less(i, j int) bool { return len(s[i]) < len(s[j])}func main() { fruits := []string{"peach", "banana", "kiwi"} sort.Sort(byLength(fruits)) fmt.Println(fruits)}
package mainimport ( "fmt" "io" "os/exec")func main() { dateCmd := exec.Command("date") dateOut, err := dateCmd.Output() if err != nil { panic(err) } fmt.Println("> date") fmt.Println(string(dateOut)) grepCmd := exec.Command("grep", "hello") grepIn, _ := grepCmd.StdinPipe() grepOut, _ := grepCmd.StdoutPipe() grepCmd.Start() grepIn.Write([]byte("hello grep\ngoodbye grep")) grepIn.Close() grepBytes, _ := io.ReadAll(grepOut) grepCmd.Wait() fmt.Println("> grep hello") fmt.Println(string(grepBytes)) lsCmd := exec.Command("bash", "-c", "ls -a -l -h") lsOut, err := lsCmd.Output() if err != nil { panic(err) } fmt.Println("> ls -a -l -h") fmt.Println(string(lsOut))}
package mainimport ( "fmt" "math/rand" "sync/atomic" "time")type readOp struct { key int resp chan int}type writeOp struct { key int val int resp chan bool}func main() { var readOps uint64 var writeOps uint64 reads := make(chan readOp) writes := make(chan writeOp) go func() { var state = make(map[int]int) for { select { case read := <-reads: read.resp <- state[read.key] case write := <-writes: state[write.key] = write.val write.resp <- true } } }() for r := 0; r < 100; r++ { go func() { for { read := readOp{ key: rand.Intn(5), resp: make(chan int)} reads <- read <-read.resp atomic.AddUint64(&readOps, 1) time.Sleep(time.Millisecond) } }() } for w := 0; w < 10; w++ { go func() { for { write := writeOp{ key: rand.Intn(5), val: rand.Intn(100), resp: make(chan bool)} writes <- write <-write.resp atomic.AddUint64(&writeOps, 1) time.Sleep(time.Millisecond) } }() } time.Sleep(time.Second) readOpsFinal := atomic.LoadUint64(&readOps) fmt.Println("readOps:", readOpsFinal) writeOpsFinal := atomic.LoadUint64(&writeOps) fmt.Println("writeOps:", writeOpsFinal)}
package mainimport ( "fmt" "os")type point struct { x, y int}func main() { p := point{1, 2} fmt.Printf("struct1: %v\n", p) fmt.Printf("struct2: %+v\n", p) fmt.Printf("struct3: %#v\n", p) fmt.Printf("type: %T\n", p) fmt.Printf("bool: %t\n", true) fmt.Printf("int: %d\n", 123) fmt.Printf("bin: %b\n", 14) fmt.Printf("char: %c\n", 33) fmt.Printf("hex: %x\n", 456) fmt.Printf("float1: %f\n", 78.9) fmt.Printf("float2: %e\n", 123400000.0) fmt.Printf("float3: %E\n", 123400000.0) fmt.Printf("str1: %s\n", "\"string\"") fmt.Printf("str2: %q\n", "\"string\"") fmt.Printf("str3: %x\n", "hex this") fmt.Printf("pointer: %p\n", &p) fmt.Printf("width1: |%6d|%6d|\n", 12, 345) fmt.Printf("width2: |%6.2f|%6.2f|\n", 1.2, 3.45) fmt.Printf("width3: |%-6.2f|%-6.2f|\n", 1.2, 3.45) fmt.Printf("width4: |%6s|%6s|\n", "foo", "b") fmt.Printf("width5: |%-6s|%-6s|\n", "foo", "b") s := fmt.Sprintf("sprintf: a %s", "string") fmt.Println(s) fmt.Fprintf(os.Stderr, "io: an %s\n", "error")}
package mainimport ( "fmt" s "strings")var p = fmt.Printlnfunc main() { p("Contains: ", s.Contains("test", "es")) p("Count: ", s.Count("test", "t")) p("HasPrefix: ", s.HasPrefix("test", "te")) p("HasSuffix: ", s.HasSuffix("test", "st")) p("Index: ", s.Index("test", "e")) p("Join: ", s.Join([]string{"a", "b"}, "-")) p("Repeat: ", s.Repeat("a", 5)) p("Replace: ", s.Replace("foo", "o", "0", -1)) p("Replace: ", s.Replace("foo", "o", "0", 1)) p("Split: ", s.Split("a-b-c-d-e", "-")) p("ToLower: ", s.ToLower("TEST")) p("ToUpper: ", s.ToUpper("test")) p() p("Len: ", len("hello")) p("Char:", "hello"[1])}
package mainimport ( "fmt" "unicode/utf8")func main() { //电脑用光标移动,会数出六个字符 6*3 = 18 const s = "สวัสดี" //打印的长长度是计算的byte值 fmt.Println("Len:", len(s)) //打印[]byte值 共18个 for i := 0; i < len(s); i++ { fmt.Printf("%x ", s[i]) } //e0 b8 aa e0 b8 a7 e0 b8 b1 e0 b8 aa e0 b8 94 e0 b8 b5 fmt.Println() fmt.Println("Rune count:", utf8.RuneCountInString(s)) //分别打印UTF-8 code point值和其偏移量 for idx, runeValue := range s { fmt.Printf("%#U starts at %d\n", runeValue, idx) } fmt.Println("\nUsing DecodeRuneInString") for i, w := 0, 0; i < len(s); i += w { runeValue, width := utf8.DecodeRuneInString(s[i:]) fmt.Printf("%#U starts at %d\n", runeValue, i) w = width examineRune(runeValue) }}func examineRune(r rune) { if r == 't' { fmt.Println("found tee") } else if r == 'ส' { fmt.Println("found so sua") }}
package mainimport "fmt"//创建结构体 person 包含name age两个字段type person struct { name string age int}func newPerson(name string) *person { p := person{name: name} p.age = 42 return &p}func main() { fmt.Println(person{"Bob", 20}) fmt.Println(person{name: "Alice", age: 30}) fmt.Println(person{name: "Fred"}) fmt.Println(&person{name: "Ann", age: 40}) fmt.Println(newPerson("Jon")) s := person{name: "Sean", age: 50} fmt.Println(s.name) //对结构体指针使用 . 指针会被自动解引用。 sp := &s fmt.Println(sp.age) //修改结构体对应的字段值 sp.age = 51 fmt.Println(sp.age)}
package mainimport ( "fmt" "time")func main() { //switch不需要break,Go中会自动添加 i := 2 fmt.Print("write ", i, " as ") switch i { case 1: fmt.Println("one") case 2: fmt.Println("two") case 3: fmt.Println("three") } switch time.Now().Weekday() { case time.Saturday, time.Sunday: fmt.Println("It's the weekend") default: fmt.Println("It's a weekday") } t := time.Now() switch { case t.Hour() < 12: fmt.Println("It's before noon") default: fmt.Println("It's after noon") } //类型开关type switch比较类型,而非value.以此判断参数的类型值 whatAmI := func(i interface{}) { switch t := i.(type) { case bool: fmt.Println("I'm a bool") case int: fmt.Println("I'm an int") default: fmt.Printf("Don't know type %T\n", t) } } whatAmI(true) whatAmI(1) whatAmI("hey")}
T-X
package mainimport ( "os" "text/template")func main() { t1 := template.New("t1") t1, err := t1.Parse("Value is {{.}}\n") if err != nil { panic(err) } t1 = template.Must(t1.Parse("Value: {{.}}\n")) t1.Execute(os.Stdout, "some text") t1.Execute(os.Stdout, 5) t1.Execute(os.Stdout, []string{ "Go", "Rust", "C++", "C#", }) Create := func(name, t string) *template.Template { return template.Must(template.New(name).Parse(t)) } t2 := Create("t2", "Name: {{.Name}}\n") t2.Execute(os.Stdout, struct { Name string }{"Jane Doe"}) t2.Execute(os.Stdout, map[string]string{ "Name": "Mickey Mouse", }) t3 := Create("t3", "{{if . -}} yes {{else -}} no {{end}}\n") t3.Execute(os.Stdout, "not empty") t3.Execute(os.Stdout, "") t4 := Create("t4", "Range: {{range .}}{{.}} {{end}}\n") t4.Execute(os.Stdout, []string{ "Go", "Rust", "C++", "C#", })}
package mainimport ( "fmt" "os" "path/filepath")func check3(e error) { if e != nil { panic(e) }}func main() { f, err := os.CreateTemp("", "sample") check3(err) fmt.Println("Temp file name:", f.Name()) defer os.Remove(f.Name()) _, err = f.Write([]byte{1, 2, 3, 4}) check3(err) dname, err := os.MkdirTemp("", "sampledir") fmt.Println("Temp dir name:", dname) defer os.RemoveAll(dname) fname := filepath.Join(dname, "file1") err = os.WriteFile(fname, []byte{1, 2}, 0666) check3(err)}
package mainimport ( "fmt" "testing")func IntMin(a, b int) int { if a < b { return a } return b}func TestIntMinBasic(t *testing.T) { ans := IntMin(2, -2) if ans != -2 { t.Errorf("IntMin(2, -2) = %d; want -2", ans) }}func TestIntMinTableDriven(t *testing.T) { var tests = []struct { a, b int want int }{ {0, 1, 0}, {1, 0, 0}, {2, -2, -2}, {0, -1, -1}, {-1, 0, -1}, } for _, tt := range tests { testname := fmt.Sprintf("%d,%d", tt.a, tt.b) t.Run(testname, func(t *testing.T) { ans := IntMin(tt.a, tt.b) if ans != tt.want { t.Errorf("got %d, want %d", ans, tt.want) } }) }}func BenchmarkIntMin(b *testing.B) { for i := 0; i < b.N; i++ { IntMin(1, 2) }}
package mainimport ( "fmt" "time")func main() { ticker := time.NewTicker(500 * time.Millisecond) done := make(chan bool) go func() { for { select { case <-done: return case t := <-ticker.C: fmt.Println("Tick at", t) } } }() time.Sleep(1600 * time.Millisecond) ticker.Stop() done <- true fmt.Println("Ticker stopped")}
package mainimport ( "fmt" "time")func main() { p := fmt.Println now := time.Now() p(now) then := time.Date( 2009, 11, 17, 20, 34, 58, 651387237, time.UTC) p(then) p(then.Year()) p(then.Month()) p(then.Day()) p(then.Hour()) p(then.Minute()) p(then.Second()) p(then.Nanosecond()) p(then.Location()) p(then.Weekday()) p(then.Before(now)) p(then.After(now)) p(then.Equal(now)) diff := now.Sub(then) p(diff) p(diff.Hours()) p(diff.Minutes()) p(diff.Seconds()) p(diff.Nanoseconds()) p(then.Add(diff)) p(then.Add(-diff))}
package mainimport ( "fmt" "time")func main() { p := fmt.Println t := time.Now() p(t.Format(time.RFC3339)) t1, e := time.Parse( time.RFC3339, "2012-11-01T22:08:41+00:00") p(t1) p(t.Format("3:04PM")) p(t.Format("Mon Jan _2 15:04:05 2006")) p(t.Format("2006-01-02T15:04:05.999999-07:00")) form := "3 04 PM" t2, e := time.Parse(form, "8 41 PM") p(t2) fmt.Printf("%d-%02d-%02dT%02d:%02d:%02d-00:00\n", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()) ansic := "Mon Jan _2 15:04:05 2006" _, e = time.Parse(ansic, "8:41PM") p(e)}
package mainimport ( "fmt" "time")func main() { c1 := make(chan string, 1) go func() { time.Sleep(2 * time.Second) c1 <- "result 1" }() select { case res := <-c1: fmt.Println(res) case <-time.After(1 * time.Second): fmt.Println("timeout 1") } c2 := make(chan string, 1) go func() { time.Sleep(2 * time.Second) c2 <- "result 2" }() select { case res := <-c2: fmt.Println(res) case <-time.After(3 * time.Second): fmt.Println("timeout 2") }}
package mainimport ( "fmt" "time")func main() { timer1 := time.NewTimer(2 * time.Second) <-timer1.C fmt.Println("Timer 1 fired") timer2 := time.NewTimer(time.Second) go func() { <-timer2.C fmt.Println("Timer 2 fired") }() stop2 := timer2.Stop() if stop2 { fmt.Println("Timer 2 stopped") } time.Sleep(2 * time.Second)}
package mainimport ( "fmt" "net" "net/url")func main() { s := "postgres://user:pass@host.com:5432/path?k=v#f" u, err := url.Parse(s) if err != nil { panic(err) } fmt.Println(u.Scheme) fmt.Println(u.User) fmt.Println(u.User.Username()) p, _ := u.User.Password() fmt.Println(p) fmt.Println(u.Host) host, port, _ := net.SplitHostPort(u.Host) fmt.Println(host) fmt.Println(port) fmt.Println(u.Path) fmt.Println(u.Fragment) fmt.Println(u.RawQuery) m, _ := url.ParseQuery(u.RawQuery) fmt.Println(m) fmt.Println(m["k"][0])}
package mainimport "fmt"func main() { fmt.Println("go" + "lang") fmt.Println("1+1 =", 1+1) fmt.Println("7.0/3.0 =", 7.0/3.0) //运用逻辑运算符 fmt.Println(true && false) fmt.Println(true || false) fmt.Println(!true)}
package mainimport "fmt"func main() { var a = "initial" fmt.Println(a) var b, c int = 1, 2 fmt.Println(b, c) var d = true fmt.Println(d) var e int fmt.Println(e) //短变量声明 := f := "short" fmt.Println(f)}
package mainimport "fmt"//通过使用 ... 使函数接收任意数量的int作为参数func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums { total += num } fmt.Println(total)}func main() { sum(1, 2) sum(1, 2, 3) nums := []int{1, 2, 3, 4} sum(nums...)}
package mainimport ( "fmt" "sync" "time")func worker2(id int) { fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id)}func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) i := i go func() { defer wg.Done() worker2(i) }() } wg.Wait()}
package mainimport ( "fmt" "time")func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "started job", j) time.Sleep(time.Second) fmt.Println("worker", id, "finished job", j) results <- j * 2 }}func main() { const numJobs = 5 jobs := make(chan int, numJobs) results := make(chan int, numJobs) for w := 1; w <= 3; w++ { go worker(w, jobs, results) } for j := 1; j <= numJobs; j++ { jobs <- j } close(jobs) for a := 1; a <= numJobs; a++ { <-results }}
package mainimport ( "bufio" "fmt" "os")func check1(e error) { if e != nil { panic(e) }}func main() { d1 := []byte("hello\ngo\n") err := os.WriteFile("/tmp/dat1", d1, 0644) check1(err) f, err := os.Create("/tmp/dat2") check1(err) defer f.Close() d2 := []byte{115, 111, 109, 101, 10} n2, err := f.Write(d2) check1(err) fmt.Printf("wrote %d bytes\n", n2) n3, err := f.WriteString("writes\n") check1(err) fmt.Printf("wrote %d bytes\n", n3) f.Sync() w := bufio.NewWriter(f) n4, err := w.WriteString("buffered\n") check1(err) fmt.Printf("wrote %d bytes\n", n4) w.Flush()}
package mainimport ( "encoding/xml" "fmt")type Plant struct { XMLName xml.Name `xml:"plant"` Id int `xml:"id,attr"` Name string `xml:"name"` Origin []string `xml:"origin"`}func (p Plant) String() string { return fmt.Sprintf("Plant id=%v, name=%v, origin=%v", p.Id, p.Name, p.Origin)}func main() { coffee := &Plant{Id: 27, Name: "Coffee"} coffee.Origin = []string{"Ethiopia", "Brazil"} out, _ := xml.MarshalIndent(coffee, " ", " ") fmt.Println(string(out)) fmt.Println(xml.Header + string(out)) var p Plant if err := xml.Unmarshal(out, &p); err != nil { panic(err) } fmt.Println(p) tomato := &Plant{Id: 81, Name: "Tomato"} tomato.Origin = []string{"Mexico", "California"} type Nesting struct { XMLName xml.Name `xml:"nesting"` Plants []*Plant `xml:"parent>child>plant"` } nesting := &Nesting{} nesting.Plants = []*Plant{coffee, tomato} out, _ = xml.MarshalIndent(nesting, " ", " ") fmt.Println(string(out))}