2.如何选择go语言基础类型——Leetcode习题9

这篇具有很好参考价值的文章主要介绍了2.如何选择go语言基础类型——Leetcode习题9。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 本篇前瞻
  • Leetcode习题9
    • 题目描述
    • 原题解析
    • 代码编写
    • 有符号整形
  • 基本数据类型
    • 整形
      • 有符号整形
      • 无符号整形
    • 浮点型
    • 布尔型
    • 字符
  • 本篇小结
  • 下一篇预告

本篇前瞻

欢迎来go语言的基础篇,这里会帮你梳理一下go语言的基本类型,注意本篇有参考go圣经,如果你有完整学习的需求可以看一下。另外,go语言的基本类型比较简单,介绍过程就比较粗暴,不过我们需要先从一个例题开始。

Leetcode习题9

先让我们看下这个来自leetcode的例子,这个是一个比较好的例子,里面有一些关于整形的的知识

题目描述

9. 回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

原题解析

注意原题中已经提供了一个go语言的函数

func isPalindrome(x int) bool {
}

为了方便我们编写代码,我们只需要知道这个函数的输入是x,输出是代表是否是回文数(是:true,否:false),return能返回输出。

解题方法:

  1. 负数必然不是回文数。

  2. 对于非负整数,我们循环x除10,通过x%10获得最低位,并且把最低位当作最高位加入到px中,得到了x的反转过来的数px

  3. 判断pxx是否相等就可以了。

代码编写

使用int32来计算px, 将如下代码提交,不行,答案错误,这是因为如果x=2147483647,那么px=7463847412,超出int32的范围了

func isPalindrome(x int) bool {
	if x < 0 {
		return false
	}

	x32 := int32(x)
	px32 := int32(x)
	for x32 != 0 {
		px32 = px32*10 + x32%10
		x32 /= 10
	}
	return px32 == int32(x)
}

那么换成int64代码如下,提交通过了,我们花费了28ms,仅仅击败12%的人,时间上有问题吗?

func isPalindrome(x int) bool {
	if (x < 0) {
		return false
	}
	x64 := int64(x)
	px64 := int64(0)
	for x64 != 0 {
		px64 = px64*10 + x64%10
		x64 /= 10
	}
	return px64 == int64(x)
}

现在尝试去掉int64的强制转化,居然通过了,只花费4ms,击败了97%的人,这不可思议!

func isPalindrome(x int) bool {
	if (x < 0) { 
		return false
	}
	x64 := x   //整形 
	px64 := 0
	for x64 != 0 { 
		px64 = px64*10 + x64%10 
		x64 /= 10
	}
	return px64 == x //布尔型
}

有符号整形

这种整形就是可以表示负整数,0和正整数

数据类型 占用空间(bit) 长度(字节) 取值范围
int8 8 1 -2^7 ~ 2^7-1(-128~127)
int16 16 2 -2^15 ~ 2^15-1(-32768 ~ 32767)
int32 32 4 -2^32 ~ 2^32-1(-2147483648 ~ 2147483647)
int64 64 8 -2^64 ~ 2^64-1(-9223372036854775808 ~ 9223372036854775807)
int 32或64 4或8 同int32或int64

注意:int的占用空间取决于你的操作系统是32位或64位

那么利用这三次提交的结果,并结合有符号整形的知识,我们可以得出:

  1. 变量强制类型转化会耗时
  2. 编程中的变量的取值范围很重要
  3. Leetcode的判题系统是64位的

基本数据类型

从上面的例题中我们能发现数据类型的选择在编程过程中有着决定性的作用,虽然这很基础,但是决定了你的编程结果是否正确,选择合适的类型会使你编写的程序运行速度更快,占用内存更小。

注意:由于复数类型不常用的关系,本章节不会介绍该类型。

整形

这个不是韩国的“绝学”——整形术,整形在编程中可以表示一定范围内的整数

注意:int或uint的占用空间取决于你的操作系统是32位或64位

对于整形我们要关注的是数据类型的长度,数据范围

代码如下:

package main

import (
	"fmt"
	"math"
	"unsafe"
)

func main() {
	fmt.Printf("int8   length: %v range: %v ~ %v\n", unsafe.Sizeof(int8(1)), math.MinInt8, math.MaxInt8)
	fmt.Printf("int16  length: %v range: %v ~ %v\n", unsafe.Sizeof(int16(1)), math.MinInt16, math.MaxInt16)
	fmt.Printf("int32  length: %v range: %v ~ %v\n", unsafe.Sizeof(int32(1)), math.MinInt32, math.MaxInt32)
	fmt.Printf("int64  length: %v range: %v ~ %v\n", unsafe.Sizeof(int64(1)), math.MinInt64, math.MaxInt64)
	fmt.Printf("int    length: %v\n", unsafe.Sizeof(int(1)))

	fmt.Printf("uint8  length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint8(1)), math.MaxUint8)
	fmt.Printf("uint16 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint16(1)), math.MaxUint16)
	fmt.Printf("uint32 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint32(1)), math.MaxUint32)
	fmt.Printf("uint64 length: %v range: 0 ~ %v\n", unsafe.Sizeof(uint64(1)), uint64(math.MaxUint64))
	fmt.Printf("uint   length: %v\n", unsafe.Sizeof(uint(1)))
}

输出:

int8   length: 1 range: -128 ~ 127
int16  length: 2 range: -32768 ~ 32767
int32  length: 4 range: -2147483648 ~ 2147483647
int64  length: 8 range: -9223372036854775808 ~ 9223372036854775807
int    length: 8
uint8  length: 1 range: 0 ~ 255
uint16 length: 2 range: 0 ~ 65535
uint32 length: 4 range: 0 ~ 4294967295
uint64 length: 8 range: 0 ~ 18446744073709551615
uint   length: 8

有符号整形

这种整形就是可以表示负整数,0和正整数

数据类型 占用空间(bit) 长度(字节) 取值范围
int8 8 1 -2^7 ~ 2^7-1(-128~127)
int16 16 2 -2^15 ~ 2^15-1(-32768 ~ 32767)
int32 32 4 -2^32 ~ 2^32-1(-2147483648 ~ 2147483647)
int64 64 8 -2^64 ~ 2^64-1(-9223372036854775808 ~ 9223372036854775807)
int 32或64 4或8 同int32或int64

无符号整形

这种整形就是可以表示非负整数

数据类型 占用空间(bit) 长度(字节) 取值范围
uint8 8 1 0 ~ 2^8-1(0 ~ 255)
uint16 16 2 0 ~ 2^16-1(0 ~ 65535)
uint32 32 4 0 ~ 2^32-1(0 ~ 4294967295)
uint64 64 8 0 ~ 2^64-1(0 ~ 18446744073709551615)
uint 32或64 4或8 同uint32或uint64

浮点型

浮点型在编程中可以表示一定范围内的实数

注意:对于浮点型我们要关注的是数据类型的长度,数据范围,但更要关注精度。

代码如下:

package main

import (
	"fmt"
	"math"
	"unsafe"
)

func main() {
	fmt.Printf("float32 length: %v range: %v ~ %v\n", unsafe.Sizeof(float32(1)), -math.MaxFloat32, math.MaxFloat32)
	fmt.Printf("float64 length: %v range: %v ~ %v\n", unsafe.Sizeof(float64(1)), -math.MaxFloat64, math.MaxFloat64)
	fmt.Printf("after transfer float32 %v\n", float32(1.328))
	fmt.Printf("after transfer float64 %v\n", float64(float32(1.328)))
}

输出:

float32 length: 4 range: -3.4028234663852886e+38 ~ 3.4028234663852886e+38
float64 length: 8 range: -1.7976931348623157e+308 ~ 1.7976931348623157e+308
before transfer float32: 1.328
after  transfer float64: 1.3279999494552612

你可以看到1.328在float32强制转化为float64反常地失去了一些精度,当然这就是为啥项目和数据库只有高精度实数的原因,你可以想象在这种情况时使用乘法后可怕的结果。

至于这个产生的原因时浮点32型和浮点64型在计算机上表示方式不同,这部分内容你可以查看《计算机程序的构造和解释》。

列表如下:

数据类型 占用空间(bit) 长度(字节) 取值范围
float32 32 4 -3.4028234663852886e+38 ~ 3.4028234663852886e+38
float64 64 8 -1.7976931348623157e+308 ~ 1.7976931348623157e+308

布尔型

最简单的类型

注意:分支语句中的if后面的表达式的结果值是true或false

代码如下:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	fmt.Printf("bool length: %v %v/%v", unsafe.Sizeof(true), 0 == 0, 0 != 0)
}

输出:

bool length: 1 true/false

列表如下:

数据类型 占用空间(bit) 长度(字节) 取值范围
bool 1 1 true/false

字符

注意:byte是包含ascii码,即uint8 ,rune是可以包含utf-8的,即uint32

代码如下:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	fmt.Printf("byte length: %v %v %c\n", unsafe.Sizeof(byte('a')),byte('a'),byte('a'))
	fmt.Printf("rune length: %v %v %c\n", unsafe.Sizeof(rune('中')),rune('中'),rune('中'))
}

输出:

byte length: 1 97 a
rune length: 4 20013 中

列表如下:

数据类型 占用空间(bit) 长度(字节) 取值范围
byte 8 1 0 ~ 2^8-1(0 ~ 255)
rune 32 4 0 ~ 2^32-1(0 ~ 4294967295)

本篇小结

很好,你已经阅读完了go的基本数据类型!看是不是简单?学习go语言其实比较简单,你先通过例题知道了选择基础数据类型的重要性,然后通过基本数据类型,你知道了每个类型都有自己的长度,取值范围和注意点,最后相关代码房子在go语言学习的go-base/2中,你需要编写这些代码来实践一下go语言。

下一篇预告

go语言的控制结构文章来源地址https://www.toymoban.com/news/detail-658452.html

到了这里,关于2.如何选择go语言基础类型——Leetcode习题9的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go 基础篇】Go语言字符类型:解析字符的本质与应用

    字符类型是计算机编程中用于表示文本和字符的数据类型,是构建字符串的基本单位。在Go语言(Golang)中,字符类型具有独特的特点和表示方式,包括Unicode编码、字符字面值以及字符操作。本篇博客将深入探讨Go语言中的字符类型,介绍字符的编码方式、字符字面值的表示

    2024年02月13日
    浏览(29)
  • 【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

    嗨,Go语言学习者们!在编程的世界里,数据是核心,而结构体(Struct)是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中,我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌套、方法以及与面向对象编程的关系,带你逐步领略结构体的魅力。

    2024年02月10日
    浏览(36)
  • 100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月08日
    浏览(29)
  • 【go语言基础】go中的方法

    先思考一个问题,什么是方法,什么是函数? 方法是从属于某个结构体或者非结构体的。在func这个和方法名中间加了一个特殊的接收器类型,这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。 函数则没有这种从属关系。 小结: 大多

    2024年02月13日
    浏览(24)
  • Go语言基础

    参考书籍《Go程序设计语言》 学习Go语言基础,并记录相关知识和代码。 创建helloworld.go 输出命令行参数 使用range简化 使用Join简化 版本二,文件与命令行 go 可以方便的创建服务器,并且有并发性。 Go并发获取多个URL 简单服务器 带有并发锁的计数服务器 显示相关协议与表单

    2024年02月11日
    浏览(37)
  • Go语言基础(一)

    本文档参考golang官方文档以及一些教程书籍,若文档有错误,欢迎issue 🤗 https://go.dev/doc/tutorial/ 参考书籍《Go语言开发实战》 Go语言是Google公司发布的一种静态型、编译型的开源编程语言,是新时代的 C语言 。Go语言已经成为 云计算时代 的重要基础编程语言。 2012年3月28日,

    2024年02月06日
    浏览(28)
  • go语言基础---8

    go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序。 ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。

    2024年02月09日
    浏览(27)
  • Go语言基础知识(一):基础介绍

    Go 语言又称 Golang,由 Google 公司于 2009 年发布,近几年伴随着云计算、微服务、分布式的发展而迅速崛起,跻身主流编程语言之列,和 Java 类似,它是一门静态的、强类型的、编译型编程语言,为并发而生,所以天生适用于并发编程(网络编程)。 目前 Go 语言支持 Windows、

    2024年02月13日
    浏览(33)
  • Go语言基础之函数

    Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。 函数定义 Go语言中定义函数使用func,具体格式如下: 其中: 函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见

    2024年02月11日
    浏览(25)
  • go语言基础操作---七

    什么是Socket Socket,英文含义是【插座、插孔】,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open – 读写write/read – 关闭close”模式来操作。Socket就是该模式的一个实

    2024年02月09日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包