【DevOps】Python+Golang(一)

Python

is和==的区别

is检查两个对象是否是同一个对象,即它们的内存地址是否相同。如果是同一个对象,则返回True,否则返回False。

==检查两个对象是否相等,即它们的值是否相同。如果值相同,则返回True,否则返回False

标识符(变量):是对象的引用,是指向对象的内存地址的指针。

在内存中创建某对象,由python解释器为其分配内存地址

不可变对象 vs 可变对象
一旦创建,值是否可以修改

字符串 VS 列表

字符串驻留技术:为了优化内存使用,python解释器在内存中维护了一个字符串池,也称缓存。
即:创建一个新的字符串对象时,先检查其是否已经存在池里,若存在,则返回现有对象的引用,所以相同字符串字面值的内存地址是相同的。

那为什么没有列表驻留技术(doge)???

列表可变(可添加、删除或者修改元素)。
假设有此技术,会带来一些问题,比如:有两个包含相同元素的列表a,b。假设它们共享同一个内存地址,修改其中一个列表的元素,另一个列表也会受到影响。将难以调试。
为避免,解释器不会对列表进行驻留优化,而是在需要时,根据需要创建新的列表对象,确保其独立状态。

Golang

编码风格写入语法,函数式编程

变量声明+赋值
变量只能声明一次,不要重复声明!(确保每个变量都具有唯一的标识符,避免对程序造成混乱和错误)
定义了变量,一定要用!

关键字var或者短变量声明:=
注意,短变量声明只能用于函数内部,而 var 声明可以用于全局变量和局部变量。

从内存地址角度理解:
在Go中,当我们声明一个变量时,编译器会分配一段内存区域来保存该变量的值,并使用其标识符来引用该内存区域。每个变量都具有唯一的标识符

a和b的值相同,但标识符不同

package main

import "fmt"

func main() {
	var a int = 1
	var b int = 1

	fmt.Printf("a: %p\n", &a)
	fmt.Printf("b: %p\n", &b)
}

a和b的值相同,但标识符不同,结果如图
【DevOps】Python+Golang(一)_第1张图片
%p 是一个格式化字符串,用于打印指针的内存地址。
&a 表示取变量 a 的地址,&b 同理。

常量语法

const identifier [type] = value

identifier 是常量的名称,遵循标识符的命名规则。
type 是可选的,表示常量的类型。如果不指定类型,编译器会根据值推断出类型。
value 是常量的值,常量表达式。

示例:

const Pi = 3.14159265359 // 定义一个无类型的浮点型常量
const Age int = 18      // 定义一个有类型的整型常量
const Name string = "Golang" //定义一个有类型的字符串常量

注意的是,在 Golang 中,常量的值不能被修改,否则会导致编译错误。

没有定义常量表达式,就跟前面的表达式一样

package main

import "fmt"

func main() {
	const (
		a = 1               // 常量 a 的值为 1
		b                   // 常量 b 的值与上一行相同,也为 1
		c = a + b           // 常量 c 的值为 2
		d = "Hello, world!" // 常量 d 的值为字符串 "Hello, world!"
		e = iota
	)

	fmt.Println(a, b, c, d,)
	fmt.Println(e)
}
}

在定义常量 b 的时候,我们没有显式地给它赋值,而是让它等于上一行的值,即常量 a 的值,这种方式称为“隐式赋值”。
注意,在这里隐式赋值只适用于常量的情况,对于变量则不存在这种隐式赋值的情况。

iota是一个预定义变量,用来计数的(自增)。当使用 const 关键字定义一个枚举类型时,如果将第一个常量的值设为 iota,则随后定义的每个常量都将自动递增。从0开始计数,也可以表示第几个变量了。

golang的输入输出

可以通过标准库 fmtbufio 实现。

fmt:
fmt.Scan()函数从标准输入中读取一个空格分隔的值,并将其存储在传递给函数的参数中。当遇到换行符或EOF时,函数停止读取输入。因此,如果您想一次读取多个值,则必须在每个值后面输入一个空格。

fmt.Scanf()函数可以使用格式字符串来指定要读取的值的类型和数量。这使得读取不同类型的数据更加方便。例如,要读取一个整数和一个字符串,您可以使用以下代码:

var i int
var s string
fmt.Scanf("%d %s", &i, &s)

fmt.Scanln()函数会读取整行输入,直到遇到换行符为止。它将输入作为单个字符串读取,并且不需要在每个值之间输入空格。例如,要读取一行文本,您可以使用以下代码:

var s string
fmt.Scanln(&s)
fmt.Println(s)


// 结果
kjfdsg,das

kjfdsg,das

bufio

计算机组成 = 计算 + 存储 + io

package main

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

func main() {
	//也可以读文件
	reader := bufio.NewReader(os.Stdin)
	//读到换行符结束,返回结果有两个,匿名变量(_)接受变量,不使用
	line, e := reader.ReadString('\n')
	fmt.Println("line=", line)
	fmt.Println("error=", e)
}

fmt.Print()原样输出不换行
fmt.Println()自动添加换行符和空格分隔符

fmt.Println("helllo", "world")
fmt.Println("jiangda")

//结果
hello world
jiangda

fmt.Printf()格式化输出

name := "jiangda"
fmt.Printf("hello, %s", name)

//结果
hello, jiangda

你可能感兴趣的:(golang,开发语言,后端)