// %+v 構造体の場合にフィールド名を出力する
//
// 1
// {Transport:<nil> CheckRedirect:<nil> Jar:<nil> Timeout:0s}
fmt.Printf("%+v\n", 1)
fmt.Printf("%+v\n", http.Client{})
// %#v 値のGoの文法での表現を出力する
//
// 1
// http.Client{Transport:http.RoundTripper(nil), CheckRedirect:(func(*http.Request, []*http.Request) error)(nil), Jar:http.CookieJar(nil), Timeout:0}
fmt.Printf("%#v\n", 1)
fmt.Printf("%#v\n", http.Client{})
// %T 値の型のGoの文法での表現を出力する
//
// int
// http.Client
fmt.Printf("%T\n", 1)
fmt.Printf("%T\n", http.Client{})
int64を超えた数値を扱いたい場合は math/big を使うが NewInt の引数がint64となっている。
func NewInt(x int64) *Int
そのため SetString を利用する
func (z *Int) SetString(s string, base int) (*Int, bool)
こんな感じになる。大きな数値を文字列からbig.Intで定義して、それに1を加え、文字列に戻している。
num, _ := new(big.Int).SetString(s, 10)
num.Add(num, big.NewInt(1))
s = num.String()
- Golangのmath/bigでIntを直接入力したい - 逆さまにした
- https://pkg.go.dev/math/big#NewInt
- https://pkg.go.dev/math/big#Int.SetString
大きな2進数の文字列(a,b)を扱う。big.Intを基数を指定して文字列にする場合はTextを使う。String()は内部的にはText(10)を呼んでいる。
i1, _ := new(big.Int).SetString(a, 2)
i2, _ := new(big.Int).SetString(b, 2)
i3 := new(big.Int).Add(i1, i2)
return i3.Text(2)
文字列を1文字ずつのスライスにする
cs := strings.Split(s, "")
i, _ := strconv.ParseInt("111", 2, 64)
fmt.Println(i) // 7
s := strconv.FormatInt(7, 2)
fmt.Println(s) // 111
文字列を反転させる
package main
import "fmt"
func main() {
// 界世 ,olleH
fmt.Println(Reverse("Hello, 世界"))
}
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
Mapの定義
sm := map[string]string{}
sm := map[string]int{}
雑でもよければこんな感じ。
q := make([]int, 0)
// push
q = append(q, 1)
q = append(q, 2)
// pop
v1 := q[0]
q = q[1:]
fmt.Println(v1, q)
// pop
v2 := q[0]
q = q[1:]
fmt.Println(v2, q)
func binarySearch(nums []int, target int) int {
start := 0
end := len(nums) - 1
var index int
for {
if end < start {
return -1
}
index = (start + end) / 2
if nums[index] == target {
return index
}
if nums[index] < target {
start = index + 1
} else {
end = index - 1
}
}
}