Why are these seemingly identical Golang structs not equal? - go

I'm trying to learn Golang testing.
I'm comparing 2 seemingly identical stucts but they are not equal. What is going wrong?
2020/01/22 17:10:10 ****2 cities[0] is type *main.City has &main.City{Name:"Boston", State:"", Country:"USA", Capital:true, Population:685000}
2020/01/22 17:10:10 ****2 expected is type *main.City has &main.City{Name:"Boston", State:"", Country:"USA", Capital:true, Population:685000}
2020/01/22 17:10:11 Preparing to DELETE 5 city docs
--- FAIL: TestCities (3.08s)
--- FAIL: TestCities/Test_POST_should_add_New_City (0.62s)
city_handlers_test.go:68: Why is ( cities[0] != expected )Boston was not added to Firestore:
got &{Boston USA true 685000}
want &{Boston USA true 685000}
FAIL
exit status 1
Here is the test:
// why don't these structs match?
log.Printf("****2 cities[0] is type %T has %#v \n", cities[0], cities[0])
log.Printf("****2 expected is type %T has %#v \n", expected, expected)
// why is this comparison failing when both are the same type with the same values?
if cities[0] != expected {
t.Errorf("Why is ( cities[0] != expected )Boston was not added to Firestore: \n got %v \n want %v", cities[0], expected)
}

You compare pointers, and it looks like they point to different objects. For the correct check, you should compare objects' fields.
This packages can help you to do this: reflect.DeepEqual(), testify.EqualValues(), cmp.Equal()
Example:
https://play.golang.org/p/09BYFeYj5xx

Related

how to use golang mongodb driver query $or with $and?

1.judge field label_status is exists, if exists is true find one record.
2.if field label_status exist is false. find one record label_status eq 1 and author
eq sample
i use the code:
bson.D{
{"$or", bson.D{{"label_status", bson.D{{"$exists", false}}}}},
{"$and", bson.A{bson.M{"label_status": Labeling}, bson.M{"annotator": "sample"}}},
}
err := collection.FindOne(context.Background(), bson.D{
{"$or", bson.D{{"label_status", bson.D{{"$exists", false}}}}},
{"$and", bson.A{bson.M{"label_status": Labeling}, bson.M{"annotator": "sample"}}},
}).Decode(&result)

Make Firestore only return users with customer_id that is less than 1000

How do I extract the users in my db that has a customer_id with less than 8 digits?
I tried to do this:
iter := client.Collection("users").Where("customer_id", "<", "10000").Documents(ctx)
But that doesn't return anything, even though I know I have users that looks like this:
map[customer_id:111]
map[customer_id:123]
If I however do
iter := client.Collection("users").Where("customer_id", "==", "111").Documents(ctx)
.. it will find that document,
EDIT: I just noticed that customer_id is stored as a string.
Not a firestore user, but I found some info from https://cloud.google.com/firestore/docs/query-data/queries.
countryQuery := cities.Where("state", "==", "CA")
popQuery := cities.Where("population", "<", 1000000)
cityQuery := cities.Where("name", ">=", "San Francisco")
So I think you should just try:
iter := client.Collection("users").Where("customer_id", "<", 10000).Documents(ctx)
The reason for this to happen is because you are having the filed set as "string" instead of "number". I had replicated the use case scenario and those are my findings:
My Firestore database:
collection: users
>> document: "auto_id"
--customer_id: 111
>> document: "auto_id"
--customer_id: 123
>> document: "auto_id"
--customer_id: 4500
>> document: "auto_id"
--customer_id: 3500
I have setup in Firestore each customer_id as string. Then when using method Where("customer_id", "==", "111") will give me map[customer_id:111] but when using Where("customer_id", "<", "1000") or Where("customer_id", "<", 1000) will give me nothing as you described.
Then I went to Firestore and changed the type of each filed from string to number and executed the code again, so I got:
map[customer_id:111]
map[customer_id:123]
My full code example in GitHub that worked for me.

ValueError: not enough values to pack (expected 2, got 1) syntax error

Hello I am taking an example from learn python the hard way and working to understand python. I have already caught one error in the book and realized you need () to print out strings. So maybe there could be some more mistakes in the syntax. when I ran this file I received an error that said
ValueError: not enough values to pack (expected 2, got 1) syntax error. And another general syntax error. So I can't set prompt to raw_input.
rom sys import argv
script, user_name = argv
prompt = '>'
print ("Hi %s, I'm the $s script.") % user_name, script
print ("I'd like to ask you a few questions.")
print ("Do you like %s?") % user_name
likes = raw_input(prompt)
print ("Where do you live %s") % user_name
lives = raw_input(prompt)
print """
(Alright, so you said %r about liking me.
You live in %r. Not sure where that is.
And you have a %r computer. Nice)
"""& (likes, lives, computer)
Is there a typo in the code example? $s instead of %s in the format string?
I suspect that your actual code has this:
print ("Hi %s, I'm the %s script.") % user_name, script
And you meant to write this:
print "Hi %s, I'm the %s script." % (user_name, script)
That is, print a single string which is the result of applying the format string to two arguments.

SDL Keyboard Handling.

SDL is a hardware abstraction layer, so it's understandable that it would map whatever the local system keys are onto a virtual keyboard.
Their wiki has this entry; https://wiki.libsdl.org/SDL_Keycode
But it never seems to take modifier keys into account when reporting the event, so that this code:
if(e.type==SDL_KEYDOWN)
{
std::cout << SDL_GetKeyName(e.key.keysym.sym) << ":" << e.key.keysym.sym << std::endl;
}
Generates this result: (UK Keyboard)
Input: 1 causes output: 1:49
Input: 2 causes output: 2:50
Input: 3 causes output: 3:51
Input: 4 causes output: 4:52
Input: Shift+1 (!) causes output: 1:49
Input: Shift+2 (") causes output: 2:50
Input: Shift+3 (£) causes output: 3:51
Input: Shift+4 ($) causes output: 4:52
Yes, I understand that I can do something like this; SDL_Keymod _keystate = SDL_GetModState(); And take each key case by case. But that would limit it to my keyboard layoyt, would be ugly code, and quite frankly would make almost everything on this page worthless; https://wiki.libsdl.org/SDL_Keycode.
So. What am I missing, it obviously isn't applying modifiers by default? Is there a way to get it do so?

Understanding crc32

I try to understand the computation of crc32. It's new to me, so the question is a basic one. With the following code I have two different ways of computing the CRC32 sum. They should (in theory) be the same, but they differ. What am I doing wrong?
The Go stdlib implementation (what a surprise) seems to be correct, but I can't find the error in my implementation.
https://play.golang.org/p/QJH2K3IQEj
package main
import (
"fmt"
"hash/crc32"
)
func main() {
message := []byte("hello")
// Is this the correct polynomial table? This is the table from
// http://gnuradio.org/redmine/projects/gnuradio/repository/revisions/1cb52da49230c64c3719b4ab944ba1cf5a9abb92/entry/gr-digital/lib/digital_crc32.cc
tbl := [256]uint32{0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,
0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9,
0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,
0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011,
0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,
0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,
0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,
0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81,
0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,
0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49,
0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,
0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,
0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,
0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE,
0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,
0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,
0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,
0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,
0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,
0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066,
0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E,
0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,
0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,
0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,
0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,
0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,
0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686,
0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,
0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,
0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,
0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F,
0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,
0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47,
0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,
0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,
0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,
0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7,
0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,
0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F,
0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,
0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,
0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,
0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F,
0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,
0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,
0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,
0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,
0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,
0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30,
0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,
0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088,
0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,
0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,
0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,
0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,
0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,
0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0,
0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,
0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668,
0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4}
crc := uint32(0xffffffff)
// different result
for _, v := range message {
crc = tbl[v^(byte(crc>>24)&0xff)] ^ (crc << 8)
}
crc = ^crc
fmt.Printf("%10d == 0x%x\n", crc, crc) // 422667581 == 0x1931653d
// same as http://zorc.breitbandkatze.de/crc.html
chk := crc32.ChecksumIEEE(message)
fmt.Printf("%10d == 0x%x\n", chk, chk) // 907060870 == 0x3610a686
}
Edit (from a comment below): I understand that the source code of Go's crc32 and mine are different. But why is my implementation giving a different result? The table I am using has the same starting polynome (from the wiki page for CRC-32) as Go's implementation (0x04C11DB7), except that Go uses the reversed polynome and therfore a different algorithm is not surprising. "My" algorithm comes from various different C/C++ sources, such as the one linked in the source.
First, it seem that you are not using the right table (or at least the same than the golang standard library): you can check it simply by comparing your table to the one available in the crc32 package. Here is a playground example.
Then, you algorithm is also wrong. To be honest, I didn't even tried to check whether you put the right values at the right places, but simply dug out the code used by crc32.Checksum. Here is a fixed version of your algorithm:
crc := uint32(0xffffffff)
for _, v := range message {
crc = tbl[byte(crc)^v] ^ (crc >> 8)
}
return ^crc
As you see, the in-loop calculation is a bit different. you can see it in action with the crc32.IEEE polynominal table here.

Resources