结构体定义与初始化结构体是一种可以包含不同类型的字段的数据类型。示例代码:typePersonstruct{NamestringAgeint}funcmain(){varpPersonfmt.Println(p)//输出:
结构体是一种可以包含不同类型的字段的数据类型。 示例代码:
type Person struct {
Name string
Age int
}
func main() {
var p Person
fmt.Println(p) // 输出: {<nil> 0}
// 初始化方式
p = Person{"Alice", 30}
fmt.Println(p) // 输出: {Alice 30}
}
可以为结构体定义方法。
示例代码:
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%+v", p)
}
func (p *Person) SetAge(age int) {
p.Age = age
}
func main() {
p := Person{"Alice", 30}
fmt.Println(p.String()) // 输出: {Name:Alice Age:30}
p.SetAge(35)
fmt.Println(p) // 输出: {Alice 35}
}
指针存储的是另一个变量的内存地址。
示例代码:
package main
import "fmt"
func main() {
a := 10
p := &a // 获取a的地址
fmt.Println(*p) // 输出: 10
}
通过指针可以修改原变量的值。
示例代码:
func update(a *int) {
*a = 20
}
func main() {
x := 5
update(&x)
fmt.Println(x) // 输出: 20
}
Go中的字符串是不可变的。
示例代码:
s := "hello"
// 无法直接修改s的内容
// s[0] = 'H' // 错误: 字符串是只读的
使用strings包进行各种操作。
示例代码:
import (
"fmt"
"strings"
)
func main() {
s := "hello world"
fmt.Println(strings.ToUpper(s)) // 输出: HELLO WORLD
}
切片是基于数组的一种抽象数据类型。
示例代码:
func main() {
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:3] // 创建一个切片
fmt.Println(slice) // 输出: [2 3]
}
切片支持动态扩展。
示例代码:
func main() {
s := make([]int, 0, 5)
for i := 0; i < 5; i++ {
s = append(s, i)
}
fmt.Println(s) // 输出: [0 1 2 3 4]
}
切片包含指向数组的指针、长度和容量。
示例代码:
func main() {
s := []int{1, 2, 3}
fmt.Println(len(s), cap(s)) // 输出: 3 3
s = append(s, 4)
fmt.Println(len(s), cap(s)) // 输出: 4 6
type hmap struct {
count, B, sizehint, nevacuate int
flags uint8
fill uint16
noverflow uint16
buckets, oldbuckets, compare, bucket, oldbucket unsafe.Pointer
}
type bmap struct {
overflow [1]uintptr
keys [0]uintptr
values [0]uintptr
}
删除元素时,Go不会立即释放空间,而是标记该位置为删除状态,以便在后续的扩容过程中清理。
package main
import (
"fmt"
)
func main() {
m := make(map[int]string)
// 添加元素
m[1] = "one"
m[2] = "two"
m[3] = "three"
// 查找元素
value, ok := m[2]
fmt.Println(value, ok) // 输出: two true
// 删除元素
delete(m, 2)
_, ok = m[2]
fmt.Println(ok) // 输出: false
}
type hchan struct {
qcount atomic.Value // number of items in circular queue
dataqsiz int // len of circular queue
buf unsafe.Pointer
elemsize uintptr // bytes in each elem
closed uint32 // closed or not
elemtype *_type // element type
sendx uint64 // send index
recvx uint64 // receive index
lock mutex
sema uint64
}
package main
import (
"fmt"
"sync"
)
func producer(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
}
func consumer(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
for n := range ch {
fmt.Println(n)
}
}
func main() {
ch := make(chan int, 10)
var wg sync.WaitGroup
wg.Add(2)
go producer(ch, &wg)
go consumer(ch, &wg)
wg.Wait()
}
type eface struct {
_type *_type
data unsafe.Pointer
}
type iface struct {
tab *itab
data unsafe.Pointer
}
package main
import (
"fmt"
)
type Shape interface {
Area() float64
}
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func main() {
rect := Rectangle{Width: 10, Height: 5}
var shape Shape = rect
// 类型断言
if r, ok := shape.(Rectangle); ok {
fmt.Println("Area:", r.Area())
} else {
fmt.Println("Not a Rectangle")
}
}
package main
import (
"fmt"
)
type Shape interface {
Area() float64
}
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func main() {
rect := Rectangle{Width: 10, Height: 5}
var shape Shape = rect
// 调用方法
fmt.Println(shape.Area()) // 输出: 50
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!