記事のディレクトリ
オペレーター
演算子は、プログラムの実行中に数学演算または論理演算を実行するために使用されます。
Go言語の組み込み演算子は、算術演算子、代入演算子、論理演算子、関係演算子、ビット単位の演算子、およびその他の演算子です。
Go言語は三項演算子をサポートしていません。
算術演算子
算術演算子は、Goプログラムでよく使用される加算、減算、乗算、除算などの数値変数に対して演算を実行します。
次の表に、Go言語のすべての算術演算子を示します。Aの値が10で、Bの値が3であるとします。
オペレーター | 説明 | 例(A = 7 B = 2) |
---|---|---|
+ | 正の符号 | + B = 2 |
- | 負 | -B = -2 |
+ | 合計 | A + B = 9 |
- | 減算 | A-B = 5 |
* | かける | A * B = 14 |
/ | 除算 | A / B = 3 |
% | 余剰 | A%B = 1 |
++ | 自己増加 | A ++ = 8 |
– | デクリメント | A-- = 6 |
+ | ストリングスプライシング | 「地獄」+「lo」=「こんにちは」 |
除算記号「/」の場合、整数除算と小数除算には違いがあります。整数を除算する場合、整数部分のみが保持され、小数部分は(丸めではなく)破棄されます。例:10/3 = 3; 10.0 / 3 = 3.333; 18/5 = 3
var res int = 10 / 3 //正确
var res int = 10.0 / 3 //错误,右边计算的结果是float类型,而左边的变量是int类型,不可以赋值
数値のモジュラス(例:A%B)をとる場合、それはA%B = A-A / B * Bと同等である可能性があるため、モジュラスの本質的な操作を確認できます。-10%3と10%-3の結果は異なります
-10 % 3 = -10 - ( -10 / 3) * 3
= -10 - (-3 * 3)
= -10+9
= -1
10 % -3 = 10 - (10 / -3) * -3
= 10 - (-3) * -3
= 10 - 9
= 1
Golangのインクリメントとデクリメントは、独立したステートメントとしてのみ使用でき、代入ステートメントの右側に表示することはできません(たとえば、var res int = n ++)。また、i ++> 0 {}のように使用することもできません。
Golangの++および-は、変数の前ではなく、変数の後にのみ書き込むことができます。つまり、a ++のみであり、++ aではありません。
Golangの設計者は、C / Javaでの自己インクリメントと自己デクリメントの紛らわしい書き込み方法を削除し、Golangをより簡潔で統一したものにしました。(必須)
関係演算子
関係演算子の結果は、trueまたはfalseのすべてのブール型です。関係式は、if構造体の条件またはループ構造体の条件でよく使用されます。
次の表に、Go言語のすべての関係演算子を示します。Aの値が10で、Bの値が20であるとします。
オペレーター | 説明 | インスタンス |
---|---|---|
== | 2つの値が等しいかどうかを確認し、等しい場合はtrueを返し、そうでない場合はfalseを返します。 | (A == B)は偽です |
!= | 2つの値が等しくないかどうかを確認し、等しくない場合はtrueを返し、等しくない場合はfalseを返します。 | (A!= B)は真です |
>> | 左側の値が右側の値よりも大きいかどうかを確認し、大きい場合はtrueを返し、そうでない場合はfalseを返します。 | (A> B)は偽です |
< | 左側の値が右側の値よりも小さいかどうかを確認し、小さい場合はtrueを返し、小さい場合はfalseを返します。 | (A <B)正しいtrue |
> = | 左側の値が右側の値以上であるかどうかを確認します。trueの場合は、falseを返します。 | (A> = B)は偽です |
<= | 左の値が右の値以下であるかどうかを確認します。trueの場合は、falseを返します。 | (A <= B)正しいtrue |
論理演算子
複数の条件(一般にリレーショナル式)を接続するために使用され、最終結果もブール値になります。
次の表に、Go言語のすべての論理演算子を示します。Aの値がTrueで、Bの値がFalseであると想定します。
オペレーター | 説明 | インスタンス |
---|---|---|
&& | 論理AND演算子。両方のオペランドがTrueの場合、条件はTrueです。それ以外の場合は、Falseです。 | (A && B)是偽 |
|| | 論理OR演算子。両側のオペランドがTrueの場合、条件はTrueです。それ以外の場合は、Falseです。 | (A || B)は真です |
! | 論理NOT演算子。条件がTrueの場合、論理NOT条件はFalseです。それ以外の場合は、Trueです。 | !(A && B)正しいTrue |
- 短絡および短絡または
&&は短絡とも呼ばれ、最初の条件が偽の場合、2番目の条件は判断されず、最終結果は偽になります
||短絡とも呼ばれます、または:最初の条件が真の場合、2番目の条件は判断されない、最終結果は本当です
代入演算子
代入演算子は、特定の操作の後に指定された変数に値を代入することです。
オペレーター | 説明 | インスタンス |
---|---|---|
= | 単純な代入演算子。式の値を左辺値に代入します | C = A + Bは、A + B式の結果をCに割り当てます |
+ = | 追加後に割り当てる | C + = AはC = C + Aと同等です |
-= | 減算後に割り当てる | C- = AはC = C-Aに等しい |
* = | 乗算後に割り当てます | C = AはC = CAに等しい |
/ = | 分割後に割り当てる | C / = AはC = C / Aに等しい |
%= | 残りの後に割り当てる | C%= AはC = C%Aと同等です |
<< = | 左シフト後に割り当てます | C << = 2等式C = C << 2 |
>> = | 右シフト後に割り当てる | C >> = 2はC = C >> 2と同等です |
&= | ビット単位およびポスト割り当て | C&= 2はC = C&2に等しい |
^ = | ビット単位のXOR後の割り当て | C ^ = 2はC = C ^ 2に等しい |
| = | ビット単位または割り当て後 | C | = 2は、C = C | 2と同等です。 |
ビット演算子
ビット演算子は、メモリ内の整数のバイナリビットを操作します。(ここでわからない場合は、まず008をご覧ください。コンピュータベースの紹介)
次の表に、ビット演算子&、|、および^の計算を示します。
p | q | p&q | n | m | p q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
A = 60、B = 13、その2進数(実際には、補数を見つけるため、補数に対して演算を実行するため)は、次のように変換されます。
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
補完コードは、操作のためにコンピュータ内で使用されます
A+B
A的原码为: 0011 1100
A的反码为: 0011 1100
A的补码为: 0011 1100
B的原码为: 0000 1101
B的反码为: 0000 1101
B的补码为: 0000 1101
A + B
0011 1100
0000 1101
--------------
0100 1001
0100 1001转换为10进制整数就是73
A-B = A + (-B)
A的原码为: 0011 1100
A的反码为: 0011 1100
A的补码为: 0011 1100
-B的原码为: 1000 1101
-B的反码为: 1111 0010
-B的补码为: 1111 0011
A - B =
0011 1100
1111 0011
--------------
0010 1111
0010 1111转换为10进制整数就是47
需要注意的是如果得到的结果是正数,则补码就是原码,但是如果得到的结果是负数,则需要将补码-1取反变成原码后再转换成整数
B - A
-A的原码为: 1011 1100
-A的反码为: 1100 0011
-A的补码为: 1100 0100
B的原码为: 0000 1101
B的反码为: 0000 1101
B的补码为: 0000 1101
B - A =
1100 0100
0000 1101
--------------
1101 0001
根据补码符号位可以看出结果为负数,所以需要先-1转换为反码1101 0000,然后符号位不变,取反为原码为1010 1111即为-47
その他の演算子
オペレーター | 説明 | インスタンス |
---|---|---|
& | 可変ストレージアドレスを返す | &a;は、変数の実際のアドレスを示します。 |
* | ポインタ変数。 | * a;はポインタ変数です |
演算子の優先順位
演算子にはさまざまな優先順位があります。いわゆる優先順位は、式演算における演算の順序です。次の表に示すように、前の行の演算子の優先順位は、常に次の行の演算子の優先順位よりも優れています。
分類 | 説明 | 関連性 |
---|---|---|
サフィックス | ()[]->。++ – | 左から右へ |
単眼 | +-!〜(タイプ)*&sizeof | 右から左へ |
乗算と除算 | * / % | 左到右 |
加减 | + - | 左到右 |
移位 | << >> | 左到右 |
关系 | < <= > >= | 左到右 |
相等 | == != | 左到右 |
按位AND | & | 左到右 |
按位XOR | ^ | 左到右 |
按位OR | | | 左到右 |
逻辑AND | && | 左到右 |
逻辑OR | || | 左到右 |
赋值运算符 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
逗号 | , | 左到右 |
基本顺序为:括号 > 单目运算 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号
- 只有单目运算符、赋值运算符是从右向左运算的。
变量与常量
变量(Variable)
变量表示内存中的一个存储区域,该区域有自己的名称(变量名)和类型(数据类型)。
方法 1
var a int //声明 声明后若不赋值,使用默认值
a = 10 //赋值
fmt.Println(a) //使用
方法 2
var a = 10 //声明并赋值 根据值自行判定数据类型(类型推导)
fmt.Println(a) //使用
方法 3
a := 10 //声明并赋值 “:=” 方式赋值时,必须是一个没有声明过的变量,否则会导致编译错误 no new variables on left side of :=
fmt.Println(a) //使用
golang 提供多变量声明与赋值
//一次性声明多个全局变量[在go中函数外部定义变量就是全局变量]
方式一:
var a = 1
var b = 2
fmt.Println(a, b)
方式二:
var (
a = 1
b = 2
)
fmt.Println(a, b)
方式三:
var a, b = 1, 2
fmt.Println(a, b)
方法四:
a, b := 1, 2
fmt.Println(a, b)
匿名变量(anonymous variable)
在使用多重赋值时,如果不需要在左值中接收变量,可以使用匿名变量
匿名变量的表现是一个下画线_,使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
匿名变量不占用命名空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
提示:在 Lua 等编程语言里,匿名变量也被叫做哑元变量。
func GetData() (int, int) {
return 100, 200
}
a, _ := GetData()
_, b := GetData()
fmt.Println(a, b)
常量(constant)
golang中,常量是指编译期间运算得出且不可改变的值。
golang常量定义的关键字为const。
常量中的数据类型只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
// 定义单个常量
const Pi float64 = 3.14159265358979323846
// 定义多个常量
const (
Size int64 = 1024
Eof int64 = -1
)
golang常量定义可以限定常量类型,也可以不限定。如果常量定义时没有限定类型,那么它与字面常量一样,是一个无类型常量。
// 定义单个常量
const Pi = 3.14159265358979323846 // 无类型浮点常量
// 定义多个常量
const (
Size = 1024 // 无类型整型常量
Eof = -1 // 无类型整型常量
)
无论是变量还是常量,不同类型的都不能显式的声明在一行:
var a int, b float32 = 1, 2.4 //编译器不通过
const c int, d float32 = 3, 4.4 //编译器不通过
const c, d float32 = 3, 4 //编译通过(此时c和d都是float32类型)
const c, d = 3, 4.4 //编译通过(此时c是int类型,d是float64类型)
当我们定义常量时,如果多个常量的值相同,后面的常量可以直接不赋值,默认等同于上面已赋值的常量的值
package main
import "fmt"
const (
a = "itbsl"
c
d
)
func main() {
fmt.Println(a, c, d)
}
结果
itbsl itbsl itbsl
我们可以通过reflect.Typeof(变量名)打印变量或常量的类型
常量可以用len()、cap()、unsafe.Sizeof()常量计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不通过,因为在编译期间自定义函数均属于未知,因此无法用于常量的赋值
golang常量定义的右值可以是一个在编译期运算的常量表达式,这与c语言中宏的性质是一样的。
const Mask = 1 << 3 // correct
const Path = os.Getenv("PATH") // incorrect : const initializer os.Getenv("PATH") is not a constant
字面常量(literal)
字面常量(literal),是指程序中硬编码的常量。
golang中字面常量是无类型的,只要该字面常量在相应类型的值域范围内,就可作为该类型的常量。
预定义常量
golang预定义了这些常量:true、false和iota
- true和false
预定义常量true和false所属的基础类型为bool
- iota
预定义常量iota所属的基础类型为int
iota可认为是一个可被编译器修改的常量:在每一个const关键字出现时值重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1
如果两个const赋值语句的表达式一样,那么可以省略后一个赋值表达式
枚举
golang并不支持众多其他语言中支持的enum关键字。
在golang中定义枚举值的方式:在const后跟一对圆括号的方式定义一组常量。