当前位置: 首页 > article >正文

Go语言练习——语法实践

目录

一、数组

1.多维数组的声明和使用

2.数组与切片的转换

3.数组在函数中的使用

二、切片

1.切片的动态扩容机制

2.切片的复制与修改

3.切片在排序算法中的应用

三、结构体

1.结构体的嵌套与方法

2.结构体与JSON的序列化

3.结构体的工厂模式

四、映射

1.映射的并发访问

2.映射与结构体的结合使用

3.映射在缓存中的应用 

五、通道

1.通道的同步发送与接收

2.通道在数据传递中的应用

3.通道在并发控制中的应用


请继续努力

如果你努力了但是没有多大的改观

并不能证明你没有用而是代表你在赎罪

这个时候你应该更加努力

欠的账总会还完,日子总会阳光明媚的

努力刚开始很简单,但是到最后却很难

没有坚持的努力,实质上没有太大的意义

所以很多人看似输掉的是结果

本质上输掉的是过程

还是那句话:

人生没有白走的路,也没有白读的书

好运呢,只是你努力的伏笔而已

哪怕乌云密布,向上爬就是晴空万里

所以 请继续努力

                                                        —— 24.9.12、

一、数组

固定长度的数据集合

1.多维数组的声明和使用

package main

import "fmt"

func main() {
	var arr [5][5]int
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			arr[i][j] = i * j
		}
	}

	for i := range arr {
		fmt.Println(arr[i])
	}

	for _, row := range arr {
		for _, col := range row {
			fmt.Printf("%d ", col)
		}
		fmt.Println()
	}
}

2.数组与切片的转换

package main

import "fmt"

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	// 左闭右开
	slice := arr[1:3]
	fmt.Println("切片", slice)

	slice2 := arr[0:4]
	fmt.Println("切片2添加前:", slice2)
	// append函数
	slice2 = append(slice2, 6)
	fmt.Println("切片2添加后:", slice2)
	slice[1] = 100
	fmt.Println("修改切片后的数组:", arr)
	for i := range slice2 {
		print(i, " ")
	}
}

3.数组在函数中的使用

package main

import "fmt"

func sumArray(arr [5]int) int {
	sum := 0
	for _, value := range arr {
		sum += value
	}
	return sum
}

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	result := sumArray(arr)
	fmt.Println(result)
}

二、切片

动态长度的数据集合

1.切片的动态扩容机制

package main

import "fmt"

func main() {
	// 初始化容量为5的切片
	slice := make([]int, 0, 5)
	for i := 0; i < 10; i++ {
		slice = append(slice, i)
	}
	fmt.Println("扩容后的切片为:", slice)
}

2.切片的复制与修改

package main

import "fmt"

func main() {
	original := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	copySilice := make([]int, len(original))
	copy(copySilice, original)
	copySilice[0] = 1
	copySilice[1] = 2
	copySilice[3] = 4
	fmt.Println("原始切片为:", original)
	fmt.Println("复制后的切片为:", copySilice)
}

3.切片在排序算法中的应用

package main

import (
	"fmt"
	"sort"
)

func main() {
	slice := []int{9, 11, 7, 17, 25, 43, 3, 27, 18}
	sort.Ints(slice)
	fmt.Println("排序后的切片为:", slice)
}

三、结构体

自定义数据据类型

1.结构体的嵌套与方法

package main

import "fmt"

type Address struct {
	City, Street string
}

type Person struct {
	Name string
	Age  int
	// 结构体的嵌套
	Address Address
}

// 打招呼
func (p *Person) Greet() {
	fmt.Printf("Hello,My name is %s,I am %d old and I live in %s\n", p.Name, p.Age, p.Address.City)
}

func main() {
	person := Person{
		Name:    "lcl",
		Age:     23,
		Address: Address{"西宁市", "同仁路"},
	}
	person.Greet()
}

2.结构体与JSON的序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Person1 struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	person := Person1{Name: "Alice", Age: 30}
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("Error:", err)
	}
	fmt.Println("JSONdata:", string(jsonData))
}

3.结构体的工厂模式

工厂模式 —— 设计模式的一种

package main

import "fmt"

type People struct {
	Name string
	Age  int
}

func NewPeople(name string, age int) *People {
	return &People{name, age}
}

func main() {
	people := NewPeople("John", 18)
	fmt.Printf("new person:%+v\n", people)
}

四、映射

键值对集合

1.映射的并发访问

package main

import (
	"fmt"
	"sync"
)

// 映射的并发访问
func main() {
	var m sync.Map
	m.Store("key1", "value1")
	m.Store("key2", "value2")

	// Load
	if v, ok := m.Load("key1"); ok {
		fmt.Println("key1:", v)
	}

	// Range
	m.Range(func(key, value interface{}) bool {
		fmt.Print(key, ":", value, "\n")
		return true
	})
}

2.映射与结构体的结合使用

package main

import "fmt"

type Book struct {
	title  string
	author string
}

func main() {
	books := make(map[string]Book)
	books["1"] = Book{"Go Programming", "Jane Doe"}
	books["2"] = Book{"Learn Go", "Jane Doe"}

	for key, value := range books {
		fmt.Println("Book ID:", key, " Title:", value.title, " Author:", value.author)
	}
}

3.映射在缓存中的应用 

package main

import "fmt"

func fibonacci(n int) int {
	cache := make(map[int]int)
	return fib(n, cache)
}

func fib(n int, cache map[int]int) int {
	if n <= 1 {
		return n
	}
	if val, ok := cache[n]; ok {
		return val
	}
	cache[n] = fib(n-1, cache) + fib(n-2, cache)
	return cache[n]
}

func main() {
	// 斐波那契数列的第n项
	fmt.Println(fib(5, make(map[int]int)))
}

五、通道

并发编程的同步机制

1.通道的同步发送与接收

package main

import "fmt"

// 当接收到通道中的值时,它表示工作完成。
func worker(done chan bool) {
	fmt.Println("Worker started")  // 打印开始工作的信息
	<-done                         // 阻塞等待,直到从通道done接收到一个值
	fmt.Println("Worker finished") // 当从通道接收到值时,打印完成工作的信息
}

func main() {
	// 创建一个布尔类型的无缓冲通道
	done := make(chan bool)
	// 使用 go 关键字启动一个新的goroutine来执行worker函数
	// 注意:原代码中的 goworker(done) 应该是 go worker(done)
	go worker(done)
	fmt.Println("Main waiting")
	// 主goroutine向通道done发送一个值,通知worker函数可以结束
	done <- true
}

2.通道在数据传递中的应用

package main

import "fmt"

func sendData(ch chan int) {
	for i := 0; i < 5; i++ {
		ch <- i
	}
	close(ch)
}

func main() {
	ch := make(chan int)
	go sendData(ch)
	for data := range ch {
		fmt.Println("Received", data)
	}
}

3.通道在并发控制中的应用

package main

import (
	"fmt"
	"sync"
)

func main() {
	// 缓冲通道,容量为2
	var wg sync.WaitGroup
	// 缓冲通道,容量为2
	ch := make(chan struct{}, 2)

	wg.Add(2)
	for i := 0; i < 2; i++ {
		go func(id int) {
			defer wg.Done()
			// 进入
			ch <- struct{}{}
			fmt.Printf("Goroutine %d is processing\n", id)
			// 离开
			<-ch
		}(i)
	}
	wg.Wait()
	fmt.Println("All goroutines have finished")
}


http://www.kler.cn/a/301621.html

相关文章:

  • 正则表达式语法详解(python)
  • 【jvm】HotSpot中方法区的演进
  • 【AtCoder】Beginner Contest 380-C.Move Segment
  • Three.js PBR材质
  • uniapp vue3的下拉刷新和上拉加载
  • vue3中pinia状态管理库使用以及持久化配置方法总结
  • Leetcode 3281. Maximize Score of Numbers in Ranges
  • 双端队列--java--黑马
  • Python 学习笔记(二)
  • Java后端开发(十六)-- JavaBean对象拷贝工具类:运用反射机制,实现对象的深拷贝
  • 指针与二维数组
  • 软考中级软件设计师-【计算机系统】必考题汇总
  • 【Java】解决项目启动时端口被占用
  • 【Linux取经之路】用户权限管理
  • 博客常见问题
  • WordPress上可以内容替换的插件
  • FreeRTOS学习笔记(八)事件
  • 个人学习笔记7-3:动手学深度学习pytorch版-李沐
  • 深圳建站公司-如何做网站
  • Navicat BI 中创建自定义字段:计算字段
  • 【隐私计算】Paillier半同态加密算法
  • 【Colab代码调试】End-to-end reproducible AI pipelines in radiology using the cloud
  • 【时时三省】c语言例题----华为机试题<统计字符>
  • JVM面试(六)垃圾收集器
  • Linux下的Makefile与进度条程序
  • STM32重定义printf,实现串口打印