一、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()
}