为了编程方便,go设计者提供了一些函数,这些函数可以直接使用,无需导入任何包。这些函数涵盖了字符串处理、数学计算、输入输出等常见操作,极大地方便了开发者的编程工作。
len: 用来计算字符串、数组、切片、映射等数据结构的长度。
package main
import "fmt"
func main() {
// 无中文的字符串len计算的是字符数
str := "Hello, World!"
fmt.Println(len(str)) // 输出: 13
// 包含中文的字符串len计算的是字节数
str2 := "你好,世界!"
fmt.Println(len(str2)) // 输出: 18,因为中文字符占用3个字节
// 数组、切片、映射的len计算的是元素个数
arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(len(arr)) // 输出: 5
// 数组、切片、映射的len计算的是元素个数
slice := []int{1, 2, 3}
fmt.Println(len(slice)) // 输出: 3
// 数组、切片、映射的len计算的是元素个数
m := map[string]int{"a": 1, "b": 2}
fmt.Println(len(m)) // 输出: 2
}
new: 用于分配内存,返回一个指向新分配的类型为T的零值的指针。
- num1 := 100 是一个普通的int变量,存储在栈上,直接使用变量名访问其值。
- num2 := new(int) 使用new分配了一个int类型的内存,num2是一个指针,指向分配的内存地址。要访问或修改num2的值,需要使用*num2来解引用指针。
package main
import "fmt"
func main() {
num1 := 100
fmt.Println(num1) // 输出: 100,num1是一个普通的int变量,存储在栈上
// 使用new分配一个int类型的内存
num2 := new(int)
fmt.Println(*num2) // 输出: 0,new分配的内存会被初始化为类型的零值
*num2 = 42
fmt.Println(*num2) // 输出: 42
fmt.Println(num2) // 输出: 0xc0000120b0,num2是一个指针,指向分配的内存地址
fmt.Println(&num2) // 输出: 0xc00000e028,&num2是指针num2的地址,不同于num2指向的地址
// 使用new分配一个结构体类型的内存
type Person struct {
Name string
Age int
}
personPtr := new(Person)
fmt.Println(*personPtr) // 输出: { 0},结构体的零值是字段的零值
personPtr.Name = "Alice"
personPtr.Age = 30
fmt.Println(*personPtr) // 输出: {Alice 30}