Golang基础-12

golang编译源代码和交叉编译方法 文章目录@[toc]golang编译源代码和交叉编译方法编译源代码编译go1.4编译go1.12交叉编译 golang编译源代码和交叉编译方法 编译源代码 golang编译其实很简单,下载一份最新的源代码后,进入src目录运行all.bash即可, 但是你可能会遇到下面问题,这是因为现在golang都是用go语言编译的了,所以你的系统必须先安装好 >= go1.4 的版本. ./all.ba... 阅读详情

Go语言基础

介绍

目录操作

文件操作

测试

介绍

  • 本文介绍Go语言中目录操作(创建目录、删除目录、重命名、遍历目录、修改权限)、文件操作(创建、打开关闭、删除、重命名、修改权限、读文件、写文件、文件定位、拷贝)、测试(单元测试、基准测试、示例)等相关知识。

目录操作

  • 在计算机中,目录是组织和存储文件的一种方式,可以多层嵌套结构。
  • Go语言提供标准包 os 中相关方法对目录进行操作。
创建
package main

import (
	"fmt"
	"os"
)

func main() {
	var path string = "./test_dir"

	// 创建单层目录,若 path 存在一个以上不存在目录,则创建失败
	// 目录已经存在,创建失败
	err := os.Mkdir(path, 0755)
	if err != nil {
		fmt.Println("create dir failed")
	} else {
		fmt.Println("create dir succeed")
	}

	path = "./test_dir/a/b"
	// 创建多层目录,未知目录嵌套数量大于等于零个
	err = os.MkdirAll(path, 0755)
	if err != nil {
		fmt.Println("create dir failed")
	} else {
		fmt.Println("create dir succeed")
	}
}
删除
package main

import (
	"fmt"
	"os"
)

func main() {
	var path string = "./test_dir"

	// 删除单层目录,若删除目录存在子目录,则删除失败
	// 删除的目录不存在时,删除失败
	err = os.Remove(path)
	if err != nil {
		fmt.Println("remove dir failed")
	} else {
		fmt.Println("remove dir succeed")
	}

	// 删除多层目录,不必关注目录是否存在
	path = "./test_dir"
	err = os.RemoveAll(path)
	if err != nil {
		fmt.Println("remove dir failed")
	} else {
		fmt.Println("remove dir succeed")
	}
}
重命名
package main

import (
	"fmt"
	"os"
)

func main() {
	var path string = "./test_dir"
	err := os.Mkdir(path, 0755)
	if err != nil {
		fmt.Println("create dir failed")
	} else {
		fmt.Println("create dir succeed")
	}

	// 重新命名时,新名称已经存在时,命名失败
	err = os.Rename(path, "./test_dir_new")
	if err != nil {
		fmt.Println("rename dir failed")
	} else {
		fmt.Println("rename dir succeed")
	}
}
遍历目录
package main

import (
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	var path string = "./../../src"

	// 读取 path 目录下所有目录,注意只读取单层,若 path 目录不存在读取失败
	dir, err := os.ReadDir(path)
	if err != nil {
		fmt.Println("read dir failed")
	} else {
		fmt.Println("read dir succeed")

		for _, v := range dir {
			fmt.Println("Name: ", v)
		}
	}

	// 遍历子目录下所有文件和子目录
	sDir := new([]os.FileInfo)
	err = filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
		*sDir = append(*sDir, info)
		return nil
	})

	if err != nil {
		fmt.Println("read dir failed")
	} else {
		fmt.Println("read dir succeed")

		for _, v := range *sDir {
			fmt.Println("Name: ", v.Name())
		}
	}
}
修改权限
package main

import (
	"fmt"
	"os"
)

func main() {
	var path string = "./test_dir"
	err := os.Mkdir(path, 0755)
	if err != nil {
		fmt.Println("create dir failed")
	} else {
		fmt.Println("create dir succeed")
	}

	// 0777 为八进制权限表示方式
	// 权限分三组:所有者(user)、组(group)和其他人(others)
	// 每组权限又分为读(r)、写(w)和执行(x)
	// 例如:rwxrw-r--(对应数组421|420|400,八进制表示0764)
	err = os.Chmod(path, 0777)
	if err != nil {
		fmt.Println("chmod failed")
	} else {
		fmt.Println("chmod succeed")
	}
}

文件操作

  • 在计算机中,文件是非常重要的IO,可以存储文件或进行数据交换等,Linux系统更是"一切皆文件"。
  • 在Go语言中,主要操作文件的包在 os 中。
创建
package main

import (
	"fmt"
	"os"
)

func main() {
	var name string = "./test_dir/test_file.txt"
	// 创建文件,路径错误会创建失败,若不存在则创建,若存在则清空文件内容
	file, err := os.Create(name)
	if err != nil {
		fmt.Println("create file failed")
	} else {
		fmt.Println("create file succeed")
		defer file.Close()
	}
}
打开关闭
package main

import (
	"fmt"
	"os"
)

func main() {
	var name string = "./test_dir/test_file.txt"
	// 打开文件,路径错误会打开失败,文件不存在会打开失败,返回文件指针与错误信息
	file, err := os.Open(name)
	if err != nil {
		fmt.Println("open file failed")
	} else {
		fmt.Println("open file succeed")
		// 使用 defer 延迟关闭方法调用
		defer file.Close()
	}

	// 通用的文件打开调用,通过标识可创建、只读、只写、追加、截断等打开文件
	// 第三个参数为权限,创建时使用,返回文件指针与错误信息
	name = "./test_dir/test_file2.txt"
	f, e := os.OpenFile(name, os.O_RDONLY|os.O_CREATE|os.O_APPEND, 0755)
	if e != nil {
		fmt.Println("open file failed")
	} else {
		fmt.Println("open file succeed")
		// 使用 defer 延迟关闭方法调用
		defer f.Close()
	}
}
删除
package main

import (
	"fmt"
	"os"
)

func main() {
	name := "./test_dir/test_file2.txt"
	// 删除文件,文件不存在或路径错误删除失败
	err = os.Remove(name)
	if err != nil {
		fmt.Println("remove file failed")
	} else {
		fmt.Println("remove file succeed")
	}
	// 删除文件,不必判断文件是否存在或路径是否正确
	err = os.RemoveAll(name)
	if err != nil {
		fmt.Println("remove file failed")
	} else {
		fmt.Println("remove file succeed")
	}
}
重命名
package main

import (
	"fmt"
	"os"
)

func main() {
	var name string = "./test_dir/test_file.txt"
	// 文件重命名,路径错误或对应目录下新文件名已经存在,重命名失败
	err := os.Rename(name, "./test_dir/test_file2.txt")
	if err != nil {
		fmt.Println("rename file failed")
	} else {
		fmt.Println("rename file succeed")
	}
}
修改权限
package main

import (
	"fmt"
	"os"
)

func main() {
	var name string = "./test_dir/test_file2.txt"
	// 文件访问权限修改
	err := os.Chmod(name, 0744)
	if err != nil {
		fmt.Println("chmod failed")
	} else {
		fmt.Println("chmod succeed")
	}
}
读文件
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	//读取文件
	file, err := os.OpenFile("./test_dir/test_file2.txt", os.O_RDONLY, 0755)
	if err != nil {
		fmt.Println("open file failed", err)
		return
	}
	defer file.Close() //main 函数结束前执行文件资源释放
	fmt.Println("open file succeed")

    // 方式一:打开文件读取
	//定义参数切片
	var arr [1024]byte = [1024]byte{0}
	result := arr[:]

	n, err := file.Read(result) //以切片的形式读取
	//读取过程中出现异常
	if err != nil && err != io.EOF {
		fmt.Println("read file failed", err)
		return
	}

	fmt.Printf("byte size: %d\n", n)
	fmt.Printf("file content: %s\n", string(result[0:n]))
	for {
		n, err = file.Read(result) //以切片的形式读取
		//读取过程中出现异常
		if err == io.EOF || n == 0 {
			break
		}
		if err != nil {
			fmt.Println("read file failed", err)
			return
		}
		fmt.Printf("byte size: %d\n", n)
		fmt.Printf("file content: %s\n", string(result[0:n]))
	}

	// 文件判断读取是否完成
	fmt.Println("read file over", err)

    // 方式二:使用 bufio 读取
	// 创建 bufio 缓冲区读取
	reader := bufio.NewReader(file)

	/*
	for { //循环读取内存,输出到程序中
		str, err := reader.ReadString('\n') //按行读取
		if err == io.EOF {
			fmt.Print(str)
			return
		}
		if err != nil {
			fmt.Println("文件读取异常", err)
			return
		}
		fmt.Print(str)
	}
	*/
}
写文件
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// 打开文件,以追加方式写入
	file, err := os.OpenFile("./test_dir/test_file2.txt", os.O_WRONLY|os.O_APPEND, 0755)
	if err != nil {
		fmt.Println("open file failed", err)
		return
	}
	defer file.Close() //main 函数结束前执行文件资源释放
	fmt.Println("open file succeed")

	// 方式一:直接追加数据
	// 字节切片写入
	file.Write([]byte("write file data, slice\n"))
	// 字符串写入
	str := "string write"
	file.WriteString(str)

	// 方式一:使用 bufio 追加数据
	// 文件写入缓冲区
	w := bufio.NewWriter(file)
	//内容写入缓冲区
	w.WriteString("\nbufio write data\n")
	//缓冲区数据刷新
	w.Flush()
}
文件定位
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	// 打开文件,默认文件指针偏移量为0,即在文件起始位置
	file, err := os.OpenFile("./test_dir/test_file2.txt", os.O_RDONLY, 0755)
	if err != nil {
		fmt.Println("open file failed", err)
		return
	}
	defer file.Close() //main 函数结束前执行文件资源释放
	fmt.Println("open file succeed")

	// 此时读取文件字节数,文件实际数据不超过1000字节
	//定义参数切片
	var arr [1024]byte = [1024]byte{0}
	result := arr[:]

	n, err := file.Read(result) //以切片的形式读取
	//读取过程中出现异常
	if err != nil && err != io.EOF {
		fmt.Println("read file failed", err)
		return
	}

	fmt.Printf("byte size: %d\n", n)

	// 以上操作读完文件后,文件指针已经指向文件末尾,此时不可能继续读取文件内容
	// 将文件指针移动到文件起始位置
	// os.SEEK_CUR, os.SEEK_CUR is deprecated
	off, e := file.Seek(0, io.SeekStart) // 相对于起始位置偏移值
	if e != nil {
		fmt.Println("seek filed")
		return
	}

	fmt.Println("off: ", off)
	n, err = file.Read(result) //以切片的形式读取
	//读取过程中出现异常
	if err != nil && err != io.EOF {
		fmt.Println("read file failed", err)
		return
	}

	fmt.Printf("byte size: %d\n", n)
}
拷贝
// 调用 Copy 方法实现文件复制
package main

import (
	"io"
	"os"
)

// 文件复制函数
func CopyFile(src, dst string) (err error) {
	in, err := os.OpenFile(src, os.O_RDONLY, 0744)
	if err != nil {
		return
	}
	defer in.Close()

    // 文件不存在就创建
	out, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0754)
	if err != nil {
		return
	}
	defer out.Close()

	_, err = io.Copy(out, in)
	return
}

func main() {
	src := "./test_dir/test_file2.txt"
	dst := "./test_dir/test_file.txt"

	err := CopyFile(src, dst)
	if err != nil {
		panic(err)
	}
}

单元测试

  • 软件开发重要环节之一就是对所写代码进行测试,编写测试用例能确保一些问题能在此阶段发现并修改。
  • Go语言中的测试依赖 go test 命令在包目录内,格式以 *_test.go 为后缀名的源代码文件都是 go test 测试的一部分。
  • 在 *_test.go 文件中有三种类型的函数,单元测试函数、基准测试函数 和示例函数。
类型格式备注
单元测试前缀为Test测试逻辑
基准测试前缀为Benchmark测试性能
示 例前缀为Example提供示例
  • 用来测试的代码必须以 _test.go 结尾。
  • 单元测试的函数名必须以 Test 开头,只有一个参数,类型是 *testing.T。
  • 单元测试函数名 Test 后,被测函数名首字母必须大写。
  • 更多功能请参照官方文档:包testing。
单元测试
// pkgtest.go 源文件
package pkgtest

func Add[T int | float32](a, b T) T {
	return a + b
}

func sub[T int | float32](a, b T) T {
	return a - b
}

// pkgtest_test.go 源文件
package pkgtest

import "testing"

// Test开头,函数名首字母大写
package pkgtest

import "testing"

func TestAdd(t *testing.T) {
	var a, b int = 10, 20
	if 31 != Add(a, b) {
		t.Error("Test failed")
		return
	}
	t.Log("Test succeed")
}

func TestSub(t *testing.T) {
	var a, b int = 10, 20
	if 31 != sub(a, b) {
		t.Error("Test failed")
		return
	}
	t.Log("Test succeed")
}

// 在终端运行指令 go test -v 输出测试结果
// 在终端运行指令 go test -cover -run -coverprofile='.\c.out' -coverpkg=pkgtest 输出覆盖测试结果
// 在终端运行指令 go tool cover -html='.\c.out' -o coverage.html 将结果转换为网页形式打开
基准测试
  • 基准测试或压力测试必须以 Benchmark 开头,并且只有参数 *testing.B。
func BenchmarkAdd(b *testing.B) {
	var a, c int = 10, 20
	for i := 0; i < 100; i++ {
		Add(a, c)
	}
}

// 在终端运行指令 go test -run "none" -bench . -benchmem 执行基准测试
示例
func ExampleAdd() {
	var a, c int = 10, 20
	fmt.Println("a + c = ", Add(a, c))
}

起始

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的另一种解决办法 昨天在关闭了中之后 就能正常打开 FDTD 了,结果今天想开启出现了同样的报错:我猜测昨天能启动的原因在于关闭之后要重启电脑,并且在重启之后我第一时间打开 lumerical 测试因此端口没有被占用,今天是在电脑启动之后一段时间才打开所以又遇到了端口占用的问题。 阅读详情

相关推荐

Win10环境借助DockerDesktop部署Open web UI集成DeepSeek

Win10环境借助DockerDesktop部署Open web UI集成DeepSeek,并借助DuckDuckGo实现联网查询

虎鲸不是鱼 1700

非零基础自学Golang 第12章 接口与类型 12.1 接口定义

非零基础自学Golang 第12章 接口与类型 12.1 接口定义

代码改变世界 825

用了7年的 source insight 3.5 背景色及字体配置(提升code效率)

在此记录并share用了7年的 source insight 3.5 背景色及字体配置,提升阅读代码效率

Chasing Freedom 7525

高端Go语言基础班-12期2023版

马哥高端Go语言基础班-12期2023版。

niwoxiangyu的博客 332

Debian 12 安装nodejs(包括node、npm、npx、yarn、pnpm、cnpm、bun)

【代码】Debian 12 安装nodejs。

mirana的专栏 8013

C#实战:如何用winmm.dll打造毫秒级高精度定时器(附完整代码)

本文详细介绍了在C#中利用winmm.dll实现毫秒级高精度定时器的完整方案。针对.NET内置定时器精度不足的问题,通过调用timeSetEvent等原生API,提供了超越系统时钟中断周期的精准定时能力。文章包含核心原理剖析、完整的封装类代码以及音视频处理、游戏开发等场景下的实战应用与性能调优指南。

ujm5678901的博客 690

100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用

本文是《100天精通Golang(基础入门篇)》系列的第12天,主要深入解析Go语言中的集合(Map)及常用函数的应用。文章从介绍什么是Map开始,然后详细讲解了Map的使用方法,包括使用make()函数创建map、delete()函数的使用、ok-idiom的应用、获取map的长度以及map作为引用类型的特点。此外,还提供了多个综合代码案例,帮助读者更好地理解和应用所学知识。通过本文的学习,读者将对Go语言中的集合(Map)有更深入的了解。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 5万+

解锁Gemini+Google Sheets/Excel:数据分析自动化新姿势

本文介绍了如何将谷歌AI工具Gemini集成到Google Sheets和Excel中进行智能数据分析。主要内容包括:1) Gemini的功能特点,具备语言理解和生成能力;2) 在Google Sheets中的集成步骤,包括订阅Workspace、开启Gemini功能及使用方法;3) 通过第三方插件在Excel中使用Gemini的方法;4) 销售和财务数据分析的实际案例;5) 使用时的注意事项,包括数据安全、问题处理和常见错误解决。通过Gemini集成,用户可以实现高效的数据处理和智能分析,提升工作效率。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 573

12Go语言基础之包

本文是李文周的博客go语言学习之路的目录提要版,方便复习查看使用,原文参见文章连接: https://www.liwenzhou.com/posts/Go/go_menu/ 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其他包。 包总结 包(package)是多个Go源码的集合,是一种高级的代码复用...

weixin_42426385的博客 203

PowerPMAC配置EtherCAT设备

本文详细介绍了在PowerPMAC IDE环境下配置EtherCAT伺服电机的完整流程。主要内容包括:准备工作(连接硬件和获取ESI文件)、通过ESI管理器加载配置文件、网络扫描识别从站设备、变量映射(定义输入输出位置参数)、激活EtherCAT通讯(验证状态字和实际位置)以及相关参数说明。文章还概述了主站配置的8个方面和从站配置的7个选项,重点说明了PDO映射和变量分配机制,为伺服电机的EtherCAT通信配置提供了系统指导。

mahuliang321的博客 972

IEC61850规约客户端软件开发实战(第六章)

IEC 61850标准中的GOOSE(Generic Object Oriented Substation Event,面向通用对象的变电站事件)功能是变电站自动化系统的核心通信机制,主要用于实现智能电子设备(IED)间高可靠性、低延时的实时信号传输。本章简述其核心功能与技术特点。

半青年的博客 1779

Golang基础_12-基础小结

目录 目录 注意事项 time的Format函数参数使用常量,不要使用字符串 在for range闭包里使用goroutine注意:要传参数进去 目录 @ 注意事项 package main表示当前脚本是程序入口,含有main函数 如果不是入口,只是单纯的...

126

【FISCO-BCOS】十一、一键部署

一键部署包括以下服务:节点(FISCO-BCOS 2.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。部署成功后,登录此网站:http://localhost:5000 访问WeBASE管理平台。快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。修改节点管理子系统和签名服务组系统的mysql数据库配置。如使用root账户:改为。配置方法:参考如下指令。

naihe_fish的博客 2596

Go语言编程笔记12:web基础

Go语言编程笔记12:web基础 图源:wallpapercave.com 开一个新坑,用Go来做web开发。虽然已经从事多年基于LAMP的web开发,但最近学习了Go编程,所以打算借着学习《Go Web 编程》一书的同时撰写笔记,算是对web开发的复习和回顾。 《Go Web 编程》作者为新加坡人,从事编程相关教学工作,此书主要内容为使用Go的标准库实现一个web应用,并借此阐述HTTP和web开发的相关理念和技能。 本篇笔记的大纲是我用幕布编写的思维导图,可以在这里查看。 Go开发web的优势 虽

梦幻天空 916

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

换个语言学一下 Golang (12)——Web基础

换个语言学一下 Golang (12)——Web基础 一、web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢?对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS...

weixin_30249203的博客 182

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

golang基础小记(12)——defer

defer语句 Go语言中的defer语句会将其后面跟随的函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。推迟的函数调用会被压入一个栈中,当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。 defer语句后面只能跟函数调用。 示例: a := 1 b := 2 defer fmt.Println(1, a + b) // 推迟的函数参数会立即赋值,后续改变参数值不会影响结果 defer func() { // 该函数没有参数,如果函数内部使用了外

m0_37710023的博客 306

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【go基础】12.unsafe包

intp与floatp 的地址相同,但是指向不同的数据类型,intp指向一个int值,floatp指向一个float32值。由于int类型有64位,float32只有32位,所以将int转换为float32时发生了内存截断,超出位数的部分被丢弃。这使得go语言是类型安全的,所有类型检查都在编译时完成,可以减少运行时的错误。强制类型转换存在安全隐患,比如转换后的类型字节长度变化,发生内存溢出或截断。强类型:每个变量在编译时明确确定,切类型不能改变。支持一些动态类型的功能,如接口和类型断言,

lixiaonan0318的博客 898

Golang基础--12--基础小结

目录 目录 注意事项 slice的append函数的真面目 time的Format函数参数使用常量,不要使用字符串 在for range闭包里使用goroutine注意:要传参数进去 注意事项 package main表示当前脚本是程序入口,含有main函数 如果不是入口,只是单纯的一个包的话,就尽量与当前目录文件夹的名称保持一致,表示一个包的脚本 slice的app...

ListentTome的博客 514

音乐分离该用哪个模型:Demucs 里 htdemucs 与 htdemucs_ft 快速对比

Demucs 音乐分离里,`htdemucs` 和 `htdemucs_ft` 是同一套混合域 Transformer 的两个版本。前者是单模型、跑得快、也是默认选项;后者由 4 个按声部微调的子模型组成,听感略好,但同一首歌要前向 4 次、耗时约 4 倍。**赶时间或批量处理选 `htdemucs`;要最好的听感又不赶时间,选 `htdemucs_ft`。** ## 为什么会有两个选项:一个模

gitblog_00656的博客 440

12. Go语言基础之map

前言 Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。 map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 12.1 map定义 map的定义语法如下: map[KeyType]ValueType 其中: KeyType:表示键的类型。 ValueType:表示键对应的值的类型。 map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为: make(map[KeyType]ValueType, [

小六 400

树莓派CM3安装golang1.12

最近项目需求,需要在树莓派CM3上安装Go语言开发环境。但是golang官方不提供高版本的armv7二进制可执行包。采用可靠方法在树莓派上编译源码安装golang。 使用安装包版本:golang1.12 安装方法: 一、使用命令安装 $apt-get install golang 但是这种方法安装上的golang版本是1.7版本。 二、源码编辑安装 在https://golang.g...

wyg315的博客 367

一、Go基础知识12、map详解

map,Go,初始化和赋值,for循环,判断元素存在及删除元素

风不归的乐园 1460

12.Go语言基础之接口

type 接口类型名 interface {方法名 1(参数列表 1) 返回值列表 1 方法名 2(参数列表 2) 返回值列表 2 … }接口类型名:Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有关闭操作的接口叫closer等。接口名最好要能突出该接口的类型含义。方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。

鹿晓鹏的博客 206

非零基础自学Golang 第12章 接口与类型 12.3 接口嵌入

非零基础自学Golang 第12章 接口与类型 12.3 接口嵌入

代码改变世界 499

非零基础自学Golang 第12章 接口与类型 12.5 类型断言

非零基础自学Golang 第12章 接口与类型 12.5 类型断言

代码改变世界 910

Go基础12:网络编程

协议(tcp/ip) TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是 Internet 最基本的协议、Internet 国际互联网络的基础,简单地说,就是由网络层的 IP 协议和传输层的 TCP 协议组成的。 OSI 与 Tcp/ip 参考模型 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6ZNO1K0-1628415906320)

qq_30001669的博客 123
上一篇: Golang基础-11
下一篇: Golang基础-13
无夜_
博客等级 码龄7年 2916粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值