Go学习笔记(四)

一、map

package main

import "fmt"

func main() {
	m := map[string]string{
		"a": "aaa",
		"b": "bbb",
		"c": "ccc",
		"d": "ddd",
	}

    // m2是一个空的map
	m2 := make(map[string]int)
    // m3==nil
	var m3 map[string]int
	fmt.Println(m, m2, m3)

	// 遍历,打印顺序随机
	for k, v := range m {
		fmt.Println(k, v)
	}

	// 获取元素,打印时字符串中有""必须用``包裹,不能用''
    // key不存在时,获取value类型的初始值
	fmt.Println(`m["c"] =`, m["c"])
	fmt.Println("m['c'] =", m["c"])
	
	if value, ok := m["cc"]; ok {
		fmt.Println(value)
	} else {
		fmt.Println("key 'cc' does not exist")
	}

	// 删除
	value, ok := m["a"]
	// "aaa", true
	fmt.Printf("m[%q] 删除前: %q, %v\n", "a", value, ok)

	delete(m, "a")
	value, ok = m["a"]
	// "", false
	fmt.Printf("m[%q] 删除后: %q, %v\n", "a", value, ok)
}

二、rune解决编码问题

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	s := "Rune学习!" // UTF-8
	fmt.Println(s)

    // 转成字节码输出
	// 52 75 6E 65 E5 AD A6 E4 B9 A0 21
	for _, b := range []byte(s) {
		fmt.Printf("%X ", b)
	}
	fmt.Println()
  
    // ch已经是rune
    // (0 52) (1 75) (2 6E) (3 65) (4 5B66) (7 4E60) (10 21)
	for i, ch := range s {
		fmt.Printf("(%d %X) ", i, ch)
	}
	fmt.Println()

    // 获取字符数量,7个rune
	fmt.Println("Rune count:", utf8.RuneCountInString(s))

	bytes := []byte(s)
	for len(bytes) > 0 {
	    // size是所占字节大小,英文1字节,中文3字节
		ch, size := utf8.DecodeRune(bytes)
		bytes = bytes[size:]
		// R u n e 学 习 !
		fmt.Printf("%c ", ch)
	}
	fmt.Println()

    // (0 R) (1 u) (2 n) (3 e) (4 学) (5 习) (6 !) 
	for i, ch := range []rune(s) {
		fmt.Printf("(%d %c) ", i, ch)
	}
	fmt.Println()
}

三、结构体和方法

go仅支持封装,不支持继承和多态。go没有class,只有struct。

值接收者VS指针接收者

1、要改变内容必须使用指针接收者

2、结构过大也考虑使用指针接收者

3、一致性:如果有指针接收者,最好都是指针接收者

package main

import (
	"fmt"
)

// 建立树结构
type tree struct {
	value int
	left, right *tree
}

// 创建节点,返回指向树的指针
func createNode(value int) *tree{
  return &tree{value:value}
}

// 打印节点值,值传递
// 前面的node tree表示接收者,调用为node.print()
func (node tree) print(){
  fmt.Println(node.value)
}

// 方法,print()调用
func print(node tree){
  fmt.Println(node.value)
}

// 如果是值接收者,无法修改值,所以需要指针接收者
func (node *tree) setValue(value int){
  if node == nil {
    fmt.Println("节点为空")
    // nil没有value,得返回
	return
  }
  node.value = value
}

// 中序遍历
func (node *tree) traverse(){
  if node == nil {
    return
  }
  
  node.left.traverse()
  node.print()
  node.right.traverse()
}

func main() {
	var root tree
	
	root = tree{value:100}
	root.left = &tree{}
	root.right = &tree{200, nil, nil}
	root.right.left = new(tree)
	root.left.right = createNode(300)
	
	root.right.left.setValue(400)
	root.right.left.print()
	print(root.right.left)
	
	root.traverse()
}

猜你喜欢

转载自blog.csdn.net/kouge94/article/details/81192299