首页
网站导航
关于
Search
1
解决Typecho Joe主题访问fastly.jsdelivr.net速度慢的方案 | 快速优化技巧
2,252 阅读
2
解决WSL2内存不释放问题的最佳指南
1,529 阅读
3
如何在 Typecho Joe 主题的文章中增加目录
1,186 阅读
4
GO语言环境的搭建教程 - 完全指南
1,042 阅读
5
如何解决Win11电脑桌面上方显示横线问题 | 窗口11教程
1,028 阅读
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
登录
Search
标签搜索
重要
go基础
git 命令
go包
phpstorm
sublime
thinkphp6
mysql问题
软件分享
redis命令
php基础
thinkphp3.2
php第三扩展包
小蚯蚓博客
累计撰写
335
篇文章
累计收到
48
条评论
首页
栏目
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
页面
网站导航
关于
搜索到
69
篇与
的结果
2023-12-30
Go语言接口超时管理及优化
服务端在调用第三方接口有可能会超时,如果超时了,一般不会让客户端一直等,要设置最大响应时间,如果超过这个时间的话,就返回。 代码如下所示: package main import ( "net/http" "time" ) func readDb() string { // 200 ms time.Sleep(200 * time.Millisecond) return "OK" } func home(w http.ResponseWriter, req *http.Request) { var resp string // 容量设置1,类型直接设置空结构体即可 done := make(chan struct{}, 1) go func() { resp = readDb() done <- struct{}{} }() // 阻塞在这里,哪个先返回,就那个解除阻塞 select { case <-done: case <-time.After(300 * time.Millisecond): // 100ms 超时 resp = "timeout" } _, _ = w.Write([]byte(resp)) } func main() { http.HandleFunc("/", home) _ = http.ListenAndServe("127.0.0.1:5678", nil) }
2023年12月30日
120 阅读
0 评论
0 点赞
2023-12-30
TCP协议详解 | 网络通信的核心技术
tcp概述 TCP(Transmission Control Protocol)又叫传输控制协议,是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的; 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端; 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。并且 TCP 报文是「有序的」,当「前一个」TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能扔给应用层去处理,同时对「重复」的 TCP 报文会自动丢弃。 优点: 可靠,稳定。TCP的可靠性体现在传输数据之前,三次握手建立连接(四次挥手断开连接),并且在数据传递时,有确认,窗口,重传,拥塞控制机制,数据传完之后断开连接来节省系统资源。 应用场景: 对网络通信质量有要求时,比如:整个数据要准确无误的传递给对方,这往往对于一些要求可靠的应用,比如HTTP,HTTPS,FTP等传输文件的协议,POP,SMTP等邮件的传输协议,websocket协议等。 头部格式 我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述 序列号: 在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号: 指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。 控制位: ACK(Acknowledge character即是确认字符):该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。 RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。 SYN(同步序列编号Synchronize Sequence Numbers):该位为 1 时,表示希望建立连接,需要同步序列号,并在其「序列号」的字段进行序列号初始值的设定。 FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。 3次握手4次挥手 一个可靠连接肯定会有以下三个过程:创建连接、 数据传输、 终止连接 创建连接 这里就是常说的‘三次握手’,其实完全可以用常识来理解这个过程,两个人之间如果想建立一个通信,至少需要有三次对话才能保证通信的可靠。举个栗子,相信大家打游戏的时候都跟队友语音过。 {timeline} {timeline-item color="#19be6b"} A:听得到吗? 建立连接,客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认 {/timeline-item} {timeline-item color="#ed4014"} B:我听到了,你能听到我说话吗? 服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; {/timeline-item} {timeline-item color="#ed4014"} A:ok,我能听到~ 客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。 {/timeline-item} {/timeline} 数据传输 {timeline} {timeline-item color="#19be6b"} A:我给你发个一堆东西,你按照顺序拼好 {/timeline-item} {timeline-item color="#ed4014"} B:收到了 发送的文件其实被拆成一个一个的小块,seq(Sequence Number)的作用是序列号,让服务器端能拼回来。 {/timeline-item} {/timeline} 终止连接 当数据传输完毕之后,就要终止连接了,也就是 ‘四次挥手’ {timeline} {timeline-item color="#19be6b"} A:我要下了,你有什么想对我说的吗? 主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了; {/timeline-item} {timeline-item color="#ed4014"} B:等等,让我说完 xxxxx…… 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2同意‘关闭’,但是要等一下,因为这里可能还有数据没有接受完 {/timeline-item} {timeline-item color="#ed4014"} B:好了,我说完了。 主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态; {/timeline-item} {timeline-item color="#ed4014"} A:那拜拜啦~ 主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。 {/timeline-item} {/timeline}
2023年12月30日
118 阅读
0 评论
0 点赞
2023-12-24
go build 编译详解
go build 参数 -o 参数 假设代码内容如下 package main import "fmt" func main() { fmt.Println("hello world") } 编译之后的可执行文件名称,例如 go build -o hello.exe 这样生成的二进制文件的名称就是 hello.exe -a 参数 强制重新编译所有包(包含标准库) go build -a -p 参数 编译时使用的 cpu 数量,如下所示,指定编译使用 2 个cpu go build -p 2 -v 参数 显示待编译包的名称,这个见 -x,这个和 -x 参数一起用,不然没有显示任何内容 -x 参数 显示正在执行的编译命令。go build 添加 -x -v 选项,可以输出构建的执行细节。-v 用于输出当前正在编译的包,而-x 则用于输出 go build 执行的每一个命令。 go build -x -v -n 参数 仅显示编译的命令,但是不执行 go build -n ![[go build 编译详解-20231224172831941.webp|800]] -work 参数 显示临时的工作目录,编译后不删 go build -work 输出 WORK=D:\project\go\goTempDir\go-build3416180188,编译后这个目录还会保存 -race 参数 启用数据竞争检查(仅amd64)。-race 命令行选项可以在构建时开启竞态检查。在程序运行时,如果发现对数据的并发竞态访问,就会给出警告。 go build -race -gcflags 参数 编译器参数。go build 实质上是通过调用 go 自带的 compile 工具对 go 代码进行编译的。 在 linux 下的位置为 $GOROOT/pkg/tool/linux_amd64/compile。 在 windows 下的位置为 $GOROOT/pkg/tool/windows_amd64/compile.exe。 go build 可以经过 -gcflags 向 compile 工具传递编译所需的命令标志选项集合。这些命令行标志选项是传递给 go 编译器的,因此可以使用下面的命令查看编译器支持的选项集合: go tool compile -help 下面是一些常用的命令行标志选项: -l:关闭内敛。 -N:关闭代码优化 -m:输出逃逸分析的分析决策过程(哪些变量在栈上分配,哪些变量在堆上分配)。 -S:输出汇编代码。 在运行调试器对程序进行调试之前,我们通常使用 -N -l 两个选项关闭对代码的内联和优化,这样能得到更多的调试信息。这个在使用 gdp 调试的是就要 go build -gcflags="-N -l" -ldflags 参数 链接器参数。go build 实质上是通过调用 go 自带的 link 工具对 go 代码进行编译的。 在 linux 下的位置为 $GOROOT/pkg/tool/linux_amd64/link。 在 windows 下的位置为 $GOROOT/pkg/tool/windows_amd64/link.exe。 使用下面的命令可以查看链接器支持的选项集合: go tool link -help 下面三个是常用的命令行选项标志: -X:设定包中 string 类型变量的值。 -s:不生成符号表。 -w:不生成 DWARF(Debugging With Attributed Record Formats)调试信息。 -H:设置可执行文件格式,eg: -H windowgui,告诉编译器是 gui 程序,不要控制台黑框打开 -X 选项的例子:可以在编译时指定程序的版本。 package main import ( "fmt" "os" ) // 全局变量 var version string func main() { if len(os.Args) > 1 && os.Args[1] == "version" { fmt.Println(version) } } 编译指定变量值,一定要带上包名称,如果多个的话,用空格隔开 -X main.version=v0.1 -X main.author=wqy go build -ldflags="-X main.version=v0.1" 执行二进制文件 ./main.exe version # 输出 v0.1 默认情况下,go build 构建出的可执行文件中都是包含 符号表 和 DWARF 格式的调试信息,这虽然让最终二进制文件的体积都增加了,但是符号表和调试信息对于生产环境下程序异常的现场保存和在线调试都有着重要意义。 如果不在意这些信息,或者对应用的大小比较敏感,那么可以通过-s 和-w 选项将这些信息从最终的二进制文件中剔除。 go build -ldflags="-s -w -X main.version=v0.1" 查看汇编代码 以下命令会输出汇编代码 go tool compile -S main.go 或者用 go run -gcflags="-S" main.go 交叉编译 所谓交叉编译,指的是在一个平台下编译出其他平台所需的可执行文件。 如果只是单纯的 go 代码,没有使用 cgo 调用 c 代码,交叉编译非常方便,只需要使用 GOOS, GOARCH 环境变量指定编译目标平台即可。 GOOS=linux go build # 32位 GOOS=linux GOARCH=386 go build 包含 CGO 代码时,需要指定交叉编译器,我平时用 zig,详细使用,可以查阅相关文档。 GOOS=Linux GOARCH=386 CC="zig cc -target x86-Linux" CXX="zig c++ -target x86-Linux" go build -o test 频繁敲写这些代码比较麻烦,可以边写 Makefile 文件,文件名称就命名为 Makefile 或 MAKEFILE dep: @go mod tidy # 代表执行 make linux 之前先执行 dep linux:dep @GOOS=linux GOARCH=amd64 go build -o main main.go @echo "linux exec is build" # 代表执行 make windows 之前先执行 dep windows:dep @GOOS=windows GOARCH=amd64 go build -o main.exe main.go @echo "windows exec is build" 写好 Makefile 文件后,只需要执行 make linux 或者 make windows 命令即可。 如果想要确认文件是否是对应的架构,可以使用 upx 压缩二进制命令,该命令在压缩的时候,会输出架构 upx -9 main 输出 条件编译 方案一 将平台信息加入文件名尾部 hello_windows_386.go,后面的 386 代表是在 32 位系统架构下,也可以是 amd64,可以不指定。 使用的时候,可以使用 go build -x 查看编译过程,查看使用哪个文件。 假设 main 包有 version_windows.go 文件,内容如下 import "fmt" var OS = "windows" func PrintOs() { fmt.Println("windows io") } version_linux.go 文件,内容如下 package main var OS = "linux" func PrintOs() { fmt.Println("linux io") } 然后,main 包在 window 平台下就可以使用该变量了,window 平台编译的时候会使用该变量 package main import "fmt" func main() { fmt.Println(OS) PrintOs() } 在 window 下编译,go build,执行编译后二进制文件,输出结果会是 windows。在 window 下交叉编译 GOOS=linux go build,然后去 linux 下执行二进制文件,输出结果是 linux。 通过这种方式,就可以实现在不同系统底下,调用不同的内容。 方案二 使用 go build 标签来指定这个文件是哪个操作系统下生效。 需要注意的是,标签和 package 语句之间需要有空行。并且这个新写法是 go 1.17 版本后生效,旧的写法和这个写法不一样,是 //+build windows 如果要再指定系统位数,可以这样 //go build linux && amd64,用 && 符号,或者的话用 ||,非的用 !。老版本用 , 和 空格 来代表与或非。例如 // go build windows || linux // go build windows && amd64 // go build windows && !386 // +build windows,amd64 #并且的关系 // +build windows linux #或者关系 方案三 使用 tag 标签。 然后编译的时候,指定 tag 即可。其实方案二,应该是系统默认会传操作系统的 tag,不用我们手动 -tags 参数指定 如果 tag 是这样,代表是有 release 和 linux 标签才可以,-tags 参数后面用空格隔开代表是并且的关系。
2023年12月24日
97 阅读
0 评论
0 点赞
2023-12-24
Windows下TDM-GCC编译器安装方法
概述 MinGW: 编译目标仅兼容 32 位应用程序,最新的官方二进制版本为 GCC 9.2.0。(OSDN) MinGW-w64: 衍生自 MinGW 的项目,编译目标兼容 32 位应用程序与 64 位应用程序,最新的官方二进制版本为 GCC 8.1.0。(SourceForge) TDM-GCC: TDM-GCC 是 Windows 上的 GCC 发行版。TDM 代表项目名称 Twilight Dragon Media。衍生自 MinGW 和 MinGW-w 64 的项目,分为 32 位与 64 位两个版本,32 位版本的编译目标仅兼容 32 位应用程序,64 位版本的编译目标兼容 32 位应用程序与 64 位应用程序,最新的官方二进制版本为 GCC 10.3.0。 个人推荐优先选择 TDM-GCC 作为首选 GCC C / C++ 编译器。 安装 下载并安装 TDM-GCC 编译器 : 下载地址 : https://jmeubank.github.io/tdm-gcc/ 点击 Read more… 链接 , 跳转到 https://jmeubank.github.io/tdm-gcc/articles/2021-05/10.3.0-release 页面 , 下载中间的 tdm64-gcc-10.3.0-2.exe 文件即可 下载后的 tdm 64-gcc-10.3.0-2.exe 文件如下 安装 TDM-GCC 编译器 双击上述安装文件 , 选择 " Create " 选项 ; 选择第二个版本 设置安装位置 : 选择安装组件 , 默认即可 ; 等待安装完毕 ; 配置环境变量 TDM-GCC 安装后的 bin 目录如下 ; 在这里插入图片描述 将上述 bin 目录 D:\001_Develop\020_TDM-GCC-64\bin 配置到环境变量中 ; 这个环境变量是安装完毕后自动配置进去的 ; 根据 Makefile 脚本编译 C 程序 使用如下命令编译程序 : mingw32-make -f Makefile.mingw 复制
2023年12月24日
125 阅读
0 评论
0 点赞
2023-12-23
goland Idea 的使用技巧
设置版权信息 设置 打开设置,并填写以下信息: 通过上面的设置之后新增类就会自动加上上面的版权信息啦~ 使用的话,光标在任意一个位置,快捷键 alt+insert,选中以下菜单,即自动在头部插入版权信息,并且创建新文件的时候,会指定插入: 参数信息 名称 类型 说明 $today DateInfo 当前日期时间对象 $file. fileName String 当前文件的名称 $file. pathName String 当前文件的完整路径 $file. className String 当前文件的类名 $file. qualifiedClassName String 当前文件的权限定名 $file. lastModified DateInfo 上一次修改的日期时间对象 $project. name String 当前项目名 $module. name String 当前 Module 名 $username String 当前用户名(系统用户名) 其中 DateInfo 又可以有如下参数: 名称 类型 说明 year int 当前年份 month int 当前月份 day int 当前日期(1-31) hour int 当前小时(0-11) hour 24 int 当前小时(0-23) minute int 当前分钟(0-59) second int 当前秒数(0-59) format (String format) String 时间日期格式化 快速生成单元测试文件 使用快捷键 alt+insert,然后有三个选项,用于生成不同类型的测试文件,自己根据需要选择 快速补齐返回参数 在函数后面敲入.var,然后 goland 会自动补齐返回参数
2023年12月23日
125 阅读
0 评论
0 点赞
2023-12-15
Go 语言网络请求教程和技术指南
post 请求 // 网络客户端 type NetClient interface { Post(url string, req, resp interface{}, header map[string]string) error } func generateUuid() string { u := uuid.NewV4().String() return u } type native struct { c *http.Client } func setHeaders(h http.Header, kv map[string]string) { h.Set("Content-Type", "application/json") h.Set("Access-token", "service") h.Set("Trace-Id", generateUuid()) for key, value := range kv { h.Set(key, value) } } func (n *native) rawPost(url string, data []byte, header map[string]string) (code int, body []byte, err error) { var resp *http.Response reader := bytes.NewReader(data) req, err := http.NewRequest("POST", url, reader) if err != nil { return } // 设置请求头 setHeaders(req.Header, header) resp, err = n.c.Do(req) if resp != nil { defer resp.Body.Close() } if err != nil { return } code = resp.StatusCode body, err = ioutil.ReadAll(resp.Body) return } func (n *native) Post(url string, req, resp interface{}, header map[string]string) (err error) { var reqBytes []byte if reqBytes, err = json.Marshal(req); err != nil { return err } var ( code int body []byte ) if code, body, err = n.rawPost(url, reqBytes, header); err != nil { return err } if code != http.StatusOK { return fmt.Errorf("http response status code !=200,code:%d", code) } return json.Unmarshal(body, resp) }
2023年12月15日
100 阅读
0 评论
0 点赞
2023-12-10
Typecho全文搜索:查找和索引文章
概述 typecho 自带的搜索方式不好用,不支持分词操作 解决 为了缩小索引力度,可以修改 mysql 配置 [mysqld] innodb_ft_min_token_size = 2 ft_min_word_len = 2 ngram_token_size = 2 更多详情可以查看:https://www.xiaoqiuyinboke.cn/archives/913.html 然后先添加全文索引 CREATE FULLTEXT INDEX ft_index_title ON blog_contents (title) WITH PARSER ngram; CREATE FULLTEXT INDEX ft_index_text ON blog_contents (text) WITH PARSER ngram; 然后修改 php 代码 var/Widget/Archive.php:759 位置,也就是 $this->countSql = clone $select; 下一行,增加 $this->countSql->cleanAttribute("order"); 如下图所示: 最后修改 php 代码 searchHandle 方法 \Widget\Archive::searchHandle 方法里修改 private function searchHandle(Query $select, &$hasPushed) { /** 增加自定义搜索引擎接口 */ //~ fix issue 40 $keywords = $this->request->get('keywords'); //$keywords = $this->request->filter('url', 'search')->keywords; self::pluginHandle()->trigger($hasPushed)->search($keywords, $this); if (!$hasPushed) { /** 搜索无法进入隐私项保护归档 */ if ($this->user->hasLogin()) { //~ fix issue 941 $select->where("table.contents.password IS NULL OR table.contents.password = '' OR table.contents.authorId = ?", $this->user->uid); } else { $select->where("table.contents.password IS NULL OR table.contents.password = ''"); } // 修改这里 $select->select( "*", "MATCH(title)AGAINST('{$keywords}') AS score_title", "MATCH(text)AGAINST('{$keywords}') AS score_text" ); // 注释原来的 //$op = $this->db->getAdapter()->getDriver() == 'pgsql' ? 'ILIKE' : 'LIKE'; // //$select->where("table.contents.title {$op} ? OR table.contents.text {$op} ?", $searchQuery, $searchQuery) // ->where('table.contents.type = ?', 'post'); // 增加这个 $select->where('table.contents.password IS NULL') ->where("((MATCH(table.contents.title)AGAINST('{$keywords}')) OR (MATCH(table.contents.text)AGAINST('{$keywords}')))") ->where('table.contents.type = ?', 'post') ->order('score_title', Db::SORT_DESC) ->order('score_text', Db::SORT_DESC); } /** 设置关键词 */ $this->keywords = $keywords; /** 设置分页 */ $this->pageRow = ['keywords' => urlencode($keywords)]; /** 设置头部feed */ /** RSS 2.0 */ $this->feedUrl = Router::url('search', ['keywords' => $keywords], $this->options->feedUrl); /** RSS 1.0 */ $this->feedRssUrl = Router::url('search', ['keywords' => $keywords], $this->options->feedAtomUrl); /** ATOM 1.0 */ $this->feedAtomUrl = Router::url('search', ['keywords' => $keywords], $this->options->feedAtomUrl); /** 设置标题 */ $this->archiveTitle = $keywords; /** 设置归档类型 */ $this->archiveType = 'search'; /** 设置归档缩略名 */ $this->archiveSlug = $keywords; /** 设置归档地址 */ $this->archiveUrl = Router::url('search', ['keywords' => $keywords], $this->options->index); /** 插件接口 */ self::pluginHandle()->searchHandle($this, $select); }
2023年12月10日
146 阅读
0 评论
0 点赞
2023-12-04
Xshell和Xftp配置心跳包不失去连接教程
Xshell 失去连接 打开 Xshell 主程序。 在顶部菜单【文件】–【属性】,选择【连接】。在右侧的设置界面中勾选保持活动状态–"连接会话期间发送保持活动状态消息 (s)",间隔建议设置为 45 秒。点击确定即可。 XFTP 失去连接需要重新连接 打开 Xftp 主程序。 在顶部菜单【文件】–【属性】,打开【默认会话属性】窗口,点击【选项】,在连接部分选择勾选"发送保持活动状态消息 (s)",间隔建议设置为 45 秒,点击确定,即可解决时不时自动断开 FTP 连接的问题。 本文 Over!
2023年12月04日
75 阅读
0 评论
0 点赞
2023-11-15
Win11系统DNS设置教程 - Win11 DNS服务器详解
概述 DNS(Domain Name System)域名系统,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,这篇文章是给大家带来的Win11设置DNS方法教程。 教程 点击开始按钮旁边的搜索图标,搜索框中 输入控制面板, 然后点击打开系统给出的最佳匹配控制面板应用 控制面板窗口,切换到类别查看方式,然后点击调整计算机的设置下的查看网络状态和任务 路径:控制面板 - 网络和 Internet - 网络和共享中心。点击连接的网络,打开属性 以太网 属性窗口,双击打开 Internet 协议版本 4 (TCP/IPv4) 默认选择的是自动获得 DNS 服务器地址,然后点击使用下面的 DNS 服务器地址,填入首选 DNS 服务器地址和备用 DNS 服务器地址(可以选择阿里云的dns,阿里云的DNS是:223.6.6.6或者223.5.5.5。),点击确定即可
2023年11月15日
97 阅读
0 评论
0 点赞
2023-10-23
Go语言基本类型解析和使用指南
无符号整型 uint 8、uint 16、uint 32、uint 64、uint(32 位操作系统为 uint 32,64 位操作系统为 uint 64)、byte(等效 unit 8,存储字符的时候用) 有符号整型 int 8、int 16、int 32、int 64、int(32 位操作系统为 int 32,64 位操作系统为 int 64)、rune (等效 int 32,标识一个 unicode 码) 浮点型 float 32、float 64 var a float32 = .152 // .152 等效 0.152 省略0 var b float64 = -0.12 // 浮点数都是有符号类型,不像整数 浮点型,可以赋予整数值,但是不能赋予整数类型变量 // 赋予整数值是可以的 var a float32 = 10 var b int = 20 // 这个是不可以的 a = b 字符型 byte (没有字符类型的,用 byte 来保存,因为 byte 满足 ascii 编码),byte 是 unit8的别名 var c1 byte = 'a' // 单引号标识字符,byte够存a的utf8码值 var c2 byte = '0' var c3 int = '北' // 汉字的utf8编码必须要用int类型来存储 var c4 = 10 + 'a' fmt.Printf("%c",c1) // 需要格式化输出,不然输出的是ascii fmt.Printf("%c",c2) fmt.Printf("%c",c3) fmt.Printf("%v",c4) // 输出107 因为 byte 的数值范围最大只有到 255,所以不能用于存储中文,需要改成 runte 或者 int 类型 var c3 route = '北' // 汉字的utf8编码必须要用int类型来存储 fmt.Printf("%c",c3) go 语言中的字符没有特定的类型,需要用整型来存储字符的 utf 8 的编码 字符用单引号 byte 存储数字和英文 中文可以用 int 存 布尔类型 bool(只能 true,或者 false) 字符串类型 字符串类型定义 var str string go 中的字符串是不可以改变的 var a = "hello" a[0] = 'a'// 会报错 用+来拼接字符串,如果字符串太长,需要将+号写在行末,不能写在另外一行的开头,因为 go 会在行末加上分号,如果发现是+号,就不加分号 var str = "a"+ "b"+"c" go 中字符可以用双引号标识字符串,但是会识别特殊字符,可以用反引号,不会识别特殊字符
2023年10月23日
149 阅读
0 评论
0 点赞
1
2
3
...
7